此代码不能在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
任何人
答案 0 :(得分:27)
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 __。
答案 1 :(得分:12)
unix是预处理器在gcc中使用的定义之一 获取defs列表
gcc -dM -E -x c /dev/null
( -dM 告诉gcc调试转储defs -E 告诉它在预处理后停止并且 -xc / dev / null 告诉他假装/ dev / null是ac文件)
答案 2 :(得分:11)
通过预处理器运行代码,找出编译器实际看到的内容:
gcc -E unix.c
然后查看预处理器是保留还是转换了变量unix
。
答案 3 :(得分:6)
这不是关键字。
预定义宏来识别系统类型。在类Unix和Unix系统上,它被定义为1
。
要禁用此功能,请使用-ansi
选项:
在C模式下,这相当于-std = c89。在C ++模式下,它相当于-std = c ++ 98。 这会关闭GCC的某些功能,这些功能与ISO C90(编译C代码时)或标准C ++(编译C ++代码时)不兼容,例如“asm”和“typeof”关键字,以及预定义宏等as“unix”和“vax”,用于标识您正在使用的系统类型。它还可以实现不受欢迎且很少使用的ISO三字符功能。对于C编译器,它禁用对C ++样式//注释以及“内联”关键字的识别。
答案 4 :(得分:2)
我要对此进行疯狂的猜测,并猜测gcc在UNIX系统上有效#defined unix为1。
尝试
main(){
printf("%d", unix);
}
看看你得到了什么。
答案 5 :(得分:2)
要回答您的问题,{C}中没有unix
不是保留字。
但是,符号unix
很可能是由预处理器定义的,因为您包含头文件或者因为编译器定义了它。