2011-03-07 26 views
24

我一直在使用这样的事情:c + +确定是否使用调试符号编译而不定义预处理器符号

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

我不确定,但我非常怀疑它。理论上,预处理可以在编译之前用'cpp'命令单独完成,预处理器没有调试符号或'-g'选项的概念。 – 2011-03-07 18:06:03

回答

21

答案是否定的。通常这些宏(DEBUG,NDEBUG,_DEBUG)由IDE/make系统根据您激活的配置(调试/版本)来设置。我认为,这些问题的答案可以帮助:

C#define macro for debug printing

Where does the -DNDEBUG normally come from?

_DEBUG vs NDEBUG

+0

我查看了NetBeans - 看起来这个IDE至少没有提供任何特定的调试标志,所以我最终在g ++命令行中做了一个手动定义,即-DDEBUG(在项目选项中) – Pete855217 2013-04-16 14:13:35

0

我认为我一直在寻找基本上是亚当发表的评论,这是答案:

编译器的作业不包括预处理,实际上编译器会阻塞预处理器未处理的任何预处理器开关,转化为代码。

如此,因为途中分支代码具有利用预处理器,这意味着由编译器得到它已经一方或另一方(调试代码或发布代码)的任何代码的时间,所以这对我来说是不可能的在这个阶段做我的问题(在预处理器之后)。

所以这是预处理器被设计为一个单独的进程代码通过的直接后果。

+0

您必须有一个不管怎么说编译器的选项是不同的,为什么不确保'NDEBUG'符号也被适当地定义呢? – 2015-01-03 07:50:07

+0

嗯,是的。为什么不。这就是它的教导,它是如何使用的,这就是为什么它是这样的原因。 (理论上和理想情况下,应该只有一个标志来控制这个,但实际上我们必须同时使用'-g'和'-DDEBUG') – 2015-01-03 08:33:39

+0

不要忘记带符号并不意味着它是'调试'或非优化构建。任何类型的构建都可以生成符号。 – 2015-01-03 19:38:48

相关问题