Является ключевым словом "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
, скорее всего, определяется препроцессором либо потому, что вы включаете заголовочный файл, либо потому, что его определяет компилятор.