宏控制DEBUG

时间:2017-02-21 03:22:44

标签: c++ macros

这是我的代码:

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

有人可以告诉我这里发生了什么吗?

我只使用预处理功能,所以它应该正常工作?。

1 个答案:

答案 0 :(得分:1)

看起来您误解了预处理器的工作原理。这是一个很好的快速教程:http://www.cplusplus.com/doc/tutorial/preprocessor/

至于您的特定问题:DEBUG宏仅基于NO_DEBUG宏定义定义一次。一旦预处理器决定使用哪个定义,您就不能再更改DEBUG宏的定义。您正在尝试使用#unset / #squile来实现此目的,但正如@Baum mit Augen所指出的那样,预处理器只是一个文本替换引擎而且非常“愚蠢”。除了替换文本之外,它不会做任何其他任何想法。

因此,当您使用实际的DEBUG宏时,它们只有一个基于NO_DEBUG的定义,您将要么打印所有内容,也不会打印任何内容,如您所见。

相关问题