这是我的代码:
macro1.h
#ifndef NO_DEBUG
#define DEBUG(arg) cout<<endl<<arg<<endl
#else
#define DEBUG(arg)
#endif
macro1.cpp
#include <iostream>
#include "macro1.h"
using namespace std;
int main()
{
cout<<endl<<"start"<<endl;
DEBUG("debug line 1");
#undef NO_DEBUG
DEBUG("debug line 2");
#define NO_DEBUG
DEBUG("debug line 3");
cout<<endl<<"end"<<endl;
return 0;
}
我像这样编译/运行它:
编译+运行1:
$ g++ macro1.cpp
$ ./a.out
start
debug line 1
debug line 2
debug line 3
end
$
编译+运行2:
$ g++ macro1.cpp -DNO_DEBUG
$ ./a.out
start
end
$
但那不是我的预期, 在NO_DEBUG未定义的第一次运行中,它必须打印:
start
debug line 1
debug line 2
end
在第二次运行中,我们通过命令行定义宏,因此必须打印:
start
debug line 2
end
有人可以告诉我这里发生了什么吗?
我只使用预处理功能,所以它应该正常工作?。
答案 0 :(得分:1)
看起来您误解了预处理器的工作原理。这是一个很好的快速教程:http://www.cplusplus.com/doc/tutorial/preprocessor/
至于您的特定问题:DEBUG宏仅基于NO_DEBUG宏定义定义一次。一旦预处理器决定使用哪个定义,您就不能再更改DEBUG宏的定义。您正在尝试使用#unset / #squile来实现此目的,但正如@Baum mit Augen所指出的那样,预处理器只是一个文本替换引擎而且非常“愚蠢”。除了替换文本之外,它不会做任何其他任何想法。
因此,当您使用实际的DEBUG宏时,它们只有一个基于NO_DEBUG的定义,您将要么打印所有内容,也不会打印任何内容,如您所见。