#define NULL NULL

J. *_*fer 8 c c++ macros null

#ifndef NULL
#define NULL NULL
#endif
Run Code Online (Sandbox Code Playgroud)

此代码在gcc中编译,没有警告/错误.有人可以解释预处理器在这里做了什么吗?

Dou*_* T. 19

在编译器看到文本"NULL"的任何地方,它将用文本"NULL"替换它.这就像在代码中搜索和替换"NULL"并替换为"NULL".不违法,只是怪异:)

  • 我认为重要的是要注意,除非NULL未定义,否则几乎肯定不会这样做.通常会定义NULL,因此该块可能不会执行任何操作. (6认同)

Art*_*ius 14

这样做的唯一可能原因是包含自己执行类似操作的头文件之前执行此操作

#ifndef NULL
#define NULL (void *)0
#endif
Run Code Online (Sandbox Code Playgroud)

这将阻止NULL被定义为这样.

  • 先生,我赞同你的化身.我很久没有想到Lemmings了. (8认同)
  • 这个问题也标记为C++,在他的书§5.1.1中,Stroustrup建议使用以下定义:`const int NULL = 0;` (3认同)

Tho*_*ini 5

这是正常的:

#ifndef JON_SKEET
#define JON_SKEET JON_SKEET
#endif
Run Code Online (Sandbox Code Playgroud)

这也编译.这是因为预处理器只是无意义的替换.它替换的内容和替换内容不需要是有效的标识符.

可以这样想:打开编辑器的Search&Replace窗口,在ReplaceReplace with字段中输入"NULL" .它不会给出任何错误或警告,它会"工作",即使它实际上没有做任何事情.预处理器做同样的事情.

显然当你尝试使用它时:

'JON_SKEET' undeclared (first use in this function)
(Each undeclared identifier is reported only once
for each function it appears in.)