C ++确定是否使用调试符号进行编译而不定义预处理器符号

时间:2011-03-07 17:56:49

标签: c++ c debugging gcc

我一直在使用这样的东西:

int main(int argc, char *argv[])
{

#ifdef DEBUG
    printf("RUNNING DEBUG BUILD");
#else
    printf("Running... this is a release build.");
#endif
...

然而,这需要我使用-DDEBUG进行编译以进行调试构建。 GCC是否为我提供了一些方法来确定何时使用调试符号(-g标志)进行编译,例如定义我自己可以检查的预处理器宏?

2 个答案:

答案 0 :(得分:23)

答案是否定的。通常这些宏(DEBUG,NDEBUG,_DEBUG)由IDE / make系统设置,具体取决于您处于活动状态的配置(调试/发布)。我认为这些答案可能有所帮助:

C #define macro for debug printing

Where does the -DNDEBUG normally come from?

_DEBUG vs NDEBUG

答案 1 :(得分:0)

我认为我所寻找的答案基本上是亚当发布的评论,即:

编译器的工作不包括预处理,实际上编译器会阻塞预处理器未处理的任何预处理器开关,这些开关将进入代码。

因此,因为分支代码的方式必须利用预处理器,这意味着当编译器获取任何代码时它已经是一个或另一个(调试代码或发布代码),所以它是我不可能在这个阶段(在预处理器之后)问我的问题。

因此,预处理器被设计为一个单独的进程来直接提供代码。