такое ограниченное ключевое слово "unix" в C? - PullRequest
26 голосов
/ 22 сентября 2010

Этот код не компилируется для меня в gcc версии 4.3.2 (Debian 4.3.2-1.1)

main(){
  int unix;
}

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

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

Кто-нибудь?

Ответы [ 6 ]

27 голосов
/ 22 сентября 2010

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 __.

12 голосов
/ 22 сентября 2010

unix - это одно из определений, которое препроцессор использует в gcc для получения списка использованных определений

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

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

11 голосов
/ 22 сентября 2010

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

gcc -E unix.c

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

6 голосов
/ 22 сентября 2010

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

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

Чтобы отключить это, используйте параметр -ansi:

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

2 голосов
/ 22 сентября 2010

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

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

2 голосов
/ 22 сентября 2010

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

попробуйте

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

и посмотрите, что вы получите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...