在C中是"unix"限制关键字?

mat*_*eek 27 c unix gcc keyword

这个代码在gcc版本4.3.2(Debian 4.3.2-1.1)上不能为我编译

main(){
  int unix;
}
Run Code Online (Sandbox Code Playgroud)

我检查了C关键字列表,"unix"不是其中之一.为什么我收到以下错误?

unix.c:2: error: expected identifier or ‘(’ before numeric constant
Run Code Online (Sandbox Code Playgroud)

任何人?

pmg*_*pmg 28

unix 不是标准保留的标识符.

如果您使用-std=c89或编译,-std=c99gcc编译器将按预期接受该程序.

从gcc手册(https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html),重点是我的.

...但是,历史上特定于系统的宏的名称没有特殊的前缀; 例如,在Unix系统上找到unix是很常见的.对于所有这些宏,GCC提供了一个并行宏,在开头和结尾添加了两个下划线.如果定义了unix,也将定义__unix__.永远不会超过两个下划线; _mips的并行是__mips__.


Nik*_*ohl 12

unix是预处理器在gcc中使用的定义之一,用于获取defs使用列表

gcc -dM -E  -x c /dev/null
Run Code Online (Sandbox Code Playgroud)

(-dM告诉gcc调试转储defs -E告诉它在预处理后停止并且-xc/dev/null告诉他假装/ dev/null是ac文件)


Kev*_*ent 11

通过预处理器运行代码以找出编译器实际看到的内容:

gcc -E unix.c
Run Code Online (Sandbox Code Playgroud)

然后查看unix预处理器是保留还是转换了您的变量.


cod*_*ict 6

它不是关键字.

它是用于标识系统类型的预定义宏.在Unix和Unix之类的系统中,它被定义为1.

要禁用它,请使用以下-ansi选项:

在C模式下,这相当于-std = c89.在C++模式下,它相当于-std = c ++ 98.这会关闭与ISO C90(编译C代码时)或标准C++(编译C++代码时)(例如"asm"和"typeof"关键字)以及预定义宏(例如"unix ")不兼容的GCC的某些功能"和"vax"标识您正在使用的系统类型.它还可以实现不受欢迎且很少使用的ISO三字符功能.对于C编译器,它禁用C++样式//注释以及"inline"关键字的识别.