unix "是C语言中的限制性关键字吗?

问题描述 投票:27回答:6

这段代码在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
c unix gcc keyword
6个回答
28
投票

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

如果你在编译时使用 -std=c89-std=c99 gcc编译器会按照你的期望接受程序。

从gcc手册( https:/gcc.gnu.orgonlinedocscppSystem-specific-Predefined-Macros.html。 ),重点是我。

... 然而,历史上系统专用宏的名称并没有特别的前缀,例如。在Unix系统中定义unix是很常见的。. 对于所有这样的宏,GCC 提供了一个在开头和结尾加两个下划线的并行宏。如果定义了 unix,那么 __unix__ 也会被定义。 下划线永远不会超过两个;_mips 的并行宏是 __mips__。


12
投票

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

gcc -dM -E  -x c /dev/null

(-dM 告诉gcc调试dump the defs。-E 告诉它在预处理后停止,并且 -x c devnull 让他假装devnull是一个c文件)


11
投票

通过预处理器运行你的代码,找出编译器实际看到的东西。

gcc -E unix.c

然后看看你的变量 unix 是由预处理器保留或转换的。


6
投票

它不是一个关键字。

它是一个 预定义的宏来识别系统的类型. 在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 "关键字。


2
投票

我猜测gcc在UNIX系统上有效地#定义了unix为1。

试试

main(){ 
  printf("%d", unix); 
} 

看看你能得到什么。


2
投票

回答你的问题,没有 unix 在C语言中不是一个保留字。

然而,符号 unix 很可能是由预处理器定义的,因为你包含了一个头文件,或者因为编译器定义了它。

© www.soinside.com 2019 - 2024. All rights reserved.