2010-09-22 5 views
23

Этот код не компилируется для меня на GCC версии 4.3.2 (Debian 4.3.2-1.1)является «unix» ограниченным ключевым словом в C?

main(){ 
    int unix; 
} 

Я проверил список C ключевые слова и «Юникс» не один из них. Почему возникает следующая ошибка?

unix.c:2: error: expected identifier or ‘(’ before numeric constant 

Кто-нибудь?

ответ

24

unix не является идентификатором, зарезервированным стандартом.

Если вы скомпилируете -std=c89 или -std=c99, то компилятор gcc примет программу, как вы ожидали.

Из руководства gcc (https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html), акцент мой.

... Тем не менее, исторически система конкретных макросов имели имена без специального префикса; например, Общеизвестно, что unix определено в Unix-системах. Для всех таких макросов GCC предоставляет параллельный макрос с двумя символами подчеркивания, добавленными в в начале и в конце. Если unix равен , то будет определен __unix__. Там никогда не будет более двух подчеркивания; Параметр _mips равен __mips__.

2

Я gona беру дикий удар по этому вопросу и предполагаю, что gcc эффективно #defined unix как 1 в системах UNIX.

попробовать

main(){ 
    printf("%d", unix); 
} 

и посмотреть, что получится.

+0

Ha! Вы правы: http://codepad.org/ML9VEsOa Stupid gcc. –

+1

@Steve: см. Ответ pmg, чтобы узнать, почему 'gcc' в нестандартном режиме имеет тенденцию определять этот макрос. –

2

Чтобы ответить на ваш вопрос, не unix не является зарезервированным словом в С.

Однако символ unix, скорее всего, определяется препроцессором либо потому, что вы заголовочный файл или потому, что компилятор определяет его.

+0

Это gcc, который делает это. –

+0

Следует отметить, что для gcc это ** нарушена ** и неконформационное поведение для gcc. –

11

запустить свой код через препроцессор, чтобы выяснить, что компилятор на самом деле видим:

gcc -E unix.c 

Затем посмотреть, если ваша переменная unix сохраняется или преобразуется препроцессором.

12

Unix является одним из определяет препроцессор использует в НКУ , чтобы получить список DEFS использовать

gcc -dM -E -x c /dev/null 

(-dM говорит куб.см до debugdump в DEFS -E рассказывает его остановка после предварительной обработки и -xc/dev/null говорит ему притворяться/dev/null является ac-файлом)

+0

короче и проще: 'эхо | gcc -E -dD -' – mirabilos

6

Это не ключевое слово.

Это предопределенный макрос для определения типа системы. В системах Unix и Unix он определен как 1.

Для того, чтобы отключить это использовать -ansi вариант:

В режиме C, это эквивалентно -std = c89. В режиме C++ он эквивалентен -std = C++ 98. Это отключает некоторые функции GCC, которые несовместимы с ISO C90 (при компиляции кода C) или стандартным C++ (при компиляции кода на C++), такими как ключевые слова «asm» и «typeof», и предопределенные макросы, такие как «unix» и «vax», которые идентифицируют тип используемой вами системы. Он также позволяет использовать нежелательную и редко используемую функцию триггера ISO. Для компилятора C он отключает распознавание комментариев C++ style //, а также ключевое слово «inline».

Смежные вопросы