是不是在C99中“定义”保留的关键字或宏名称?

时间:2019-09-06 15:15:28

标签: c c99

不是用C语言“定义”保留的关键字或宏名称吗?

#undef define

我很惊讶地发现这段代码在GCC上编译得很好,没有任何警告或错误。这样的代码会有副作用吗?

2 个答案:

答案 0 :(得分:4)

define不是C中的关键字,#define是(实际上是两个标记,因此# define也可以工作;但是没有以#开头的define并不保留)。

尽管如此,您仍可以在C中重新定义所有想要的关键字。只有在C ++中才允许使用此关键字,并且大多数编译器都可以选择撤销该(错误*)决定。

我刚刚测试过编译此代码:

#define auto
int main(){}

auto是C语言中的关键字,可以很好地构建。

如果可以定义某些内容,则可以使用#undef取消定义。 #undef不会先检查某个东西是否是宏,这是有意的。在非宏上使用#undef是不可行的事情。

如果您想使用自己的旧地址,请在#undeffgetc上使用fputc。显然,除非#undef fgetc不是宏,否则它不会是可移植的。

* Linux内核标头:struct namespace {;如果无法完成#define namespace namespace_,则无法针对C ++进行修复。

答案 1 :(得分:1)

define不是C关键字,而是预处理指令的一部分,该指令包括整行,以#开头(可选前面有空格)。预处理指令具有自己的语法和“关键字”,与C语言的语法和“关键字”不同,您无法通过宏进行覆盖。

要了解不同之处,请尝试使用cc -E

#define ifndef  ifdef
#define one 1

#ifndef one
wtf?
#else
"ifndef" not recognized as a macro
#endif

#ifdef ifndef
"ifndef" recognized as a macro
#else
wtf?
#endif