这段代码在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
unix
不是标准保留的标识符。
如果你在编译时使用 -std=c89
或 -std=c99
gcc编译器会按照你的期望接受程序。
从gcc手册( https:/gcc.gnu.orgonlinedocscppSystem-specific-Predefined-Macros.html。 ),重点是我。
... 然而,历史上系统专用宏的名称并没有特别的前缀,例如。在Unix系统中定义unix是很常见的。. 对于所有这样的宏,GCC 提供了一个在开头和结尾加两个下划线的并行宏。如果定义了 unix,那么 __unix__ 也会被定义。 下划线永远不会超过两个;_mips 的并行宏是 __mips__。
unix 是预处理器在 gcc 中用来获取 defs 列表的定义之一。
gcc -dM -E -x c /dev/null
(-dM 告诉gcc调试dump the defs。-E 告诉它在预处理后停止,并且 -x c devnull 让他假装devnull是一个c文件)
通过预处理器运行你的代码,找出编译器实际看到的东西。
gcc -E unix.c
然后看看你的变量 unix
是由预处理器保留或转换的。
它不是一个关键字。
它是一个 预定义的宏来识别系统的类型. 在Unix和类似Unix的系统中,它被定义为 1
.
要禁用该功能,请使用 -ansi
选项,在C模式下,这相当于-std=c89。
在C模式下,相当于-std=c89。在C++模式下,相当于-std=c++98。 这将关闭GCC的某些与ISO C90(编译C代码时)或标准C++(编译C++代码时)不兼容的特性,例如 "asm "和 "typeof "关键字,以及 预定义的宏,如 "unix"。 和 "vax",以识别您使用的系统类型。它还启用了不受欢迎的、很少使用的ISO三角图功能。 对于C编译器,它禁用了C++风格/注释的识别以及 "inline "关键字。
我猜测gcc在UNIX系统上有效地#定义了unix为1。
试试
main(){
printf("%d", unix);
}
看看你能得到什么。
回答你的问题,没有 unix
在C语言中不是一个保留字。
然而,符号 unix
很可能是由预处理器定义的,因为你包含了一个头文件,或者因为编译器定义了它。