Является ключевым словом "unix" в C?

Этот код не компилируется для меня в 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

Кто-нибудь?

Ответ 1

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

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

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

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

Ответ 3

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

gcc -E unix.c

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

Ответ 4

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

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

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

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

Ответ 5

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

попробуйте

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

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

Ответ 6

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

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