不是用C语言“定义”保留的关键字或宏名称吗?
#undef define
我很惊讶地发现这段代码在GCC上编译得很好,没有任何警告或错误。这样的代码会有副作用吗?
答案 0 :(得分:4)
define
不是C中的关键字,#define
是(实际上是两个标记,因此# define
也可以工作;但是没有以#开头的define并不保留)。
尽管如此,您仍可以在C中重新定义所有想要的关键字。只有在C ++中才允许使用此关键字,并且大多数编译器都可以选择撤销该(错误*)决定。
我刚刚测试过编译此代码:
#define auto
int main(){}
auto
是C语言中的关键字,可以很好地构建。
如果可以定义某些内容,则可以使用#undef
取消定义。 #undef
不会先检查某个东西是否是宏,这是有意的。在非宏上使用#undef
是不可行的事情。
如果您想使用自己的旧地址,请在#undef
和fgetc
上使用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