在C中是“unix”限制关键字?

时间:2010-09-22 14:35:55

标签: c unix gcc keyword

此代码不能在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 个答案:

答案 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很可能是由预处理器定义的,因为您包含头文件或者因为编译器定义了它。