#ifndef NULL
#define NULL NULL
#endif此代码在没有任何警告/错误的情况下在gcc中编译。有人能解释一下预处理器在这里做什么吗?
发布于 2009-12-23 06:41:06
只要编译器看到文本"NULL“,它就会将其替换为文本"NULL”。这就像在代码中搜索并替换"NULL“,并替换为"NULL”。不是非法的,只是很奇怪:)
发布于 2009-12-23 06:45:25
这样做的唯一可能的原因是在包含头文件之前这样做,头文件本身做类似这样的事情
#ifndef NULL
#define NULL (void *)0
#endif这将阻止NULL像这样被定义。
发布于 2009-12-23 07:02:46
我见过这样的代码将值从编译器名称空间(通常是“名称空间”,而不是C++ namespace)带入预处理器名称空间的情况。
// In the compiler namespace, not in the preprocessor namespace
static int const FOO = 1234;
// Bring the constant into the preprocessor namespace as well
#ifndef FOO // <---- FOO really is undefined here.
#define FOO FOO
#endif非常丑陋的东西。
就我个人而言,我还没有发现这种东西的用途,但仍然存在。
编辑:虽然我已经看到了这一点,但我不知道它为什么有用,除了检查"FOO“是否在代码中的其他地方定义为预处理器符号;也许是在处理一些遗留代码时。有没有人?
https://stackoverflow.com/questions/1949670
复制相似问题