#ifndef NULL
#define NULL NULL
#endif
Run Code Online (Sandbox Code Playgroud)
此代码在gcc中编译,没有警告/错误.有人可以解释预处理器在这里做了什么吗?
Dou*_* T. 19
在编译器看到文本"NULL"的任何地方,它将用文本"NULL"替换它.这就像在代码中搜索和替换"NULL"并替换为"NULL".不违法,只是怪异:)
Art*_*ius 14
这样做的唯一可能原因是在包含自己执行类似操作的头文件之前执行此操作
#ifndef NULL
#define NULL (void *)0
#endif
Run Code Online (Sandbox Code Playgroud)
这将阻止NULL被定义为这样.
这是正常的:
#ifndef JON_SKEET
#define JON_SKEET JON_SKEET
#endif
Run Code Online (Sandbox Code Playgroud)
这也编译.这是因为预处理器只是无意义的替换.它替换的内容和替换内容不需要是有效的标识符.
可以这样想:打开编辑器的Search&Replace窗口,在Replace和Replace with字段中输入"NULL" .它不会给出任何错误或警告,它会"工作",即使它实际上没有做任何事情.预处理器做同样的事情.
显然当你尝试使用它时:
'JON_SKEET' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.)