当g被指定时,gcc是否定义了任何东西?

不久,我想知道gcc(或g ++。我需要它在C中 ,但也很好奇c ++)定义任何特殊的符号,如果启用-g 。 可以? 如果是这样,什么符号?

在search过程中,我发现:

  • _DEBUG是手动定义的(通过手动方式我是指-D_DEBUG ),并且是从Visual C程序员中-D_DEBUG的习惯(因为VC在debugging模式下编译时定义了_DEBUG
  • 如果在debugging模式下, NDEBUG被定义。 虽然我发现有几个地方这样说,但我用gcc和g ++在.c和.cpp文件中试过,没有或没有-g没有定义这样的符号!

编辑 :让我演示为什么我不想使用非标准符号:

设想一个内核模块,它可以执行某些操作,并提供包含在其他内核模块中的头文件,以便它们可以连接到这个模块。

现在作为一个设施,在我有一个头文件:

 #ifdef DEBUG <-- This is what I need #define LOG(x, ...) printk("Some extra info"x, ##__VA_ARGS__); #else #define LOG(x, ...) printk("Without extra info"x, ##__VA_ARGS__); #endif 

请注意,名称不是真正的LOG ,这是一个例子。

现在,我可以使用任何符号来进行DEBUG ,但是如果有人包含我的头文件,他们可能不会定义这个符号。 当然,我可以告诉他们“顺便说一下,为了得到标题在debugging模式,定义这个另一个符号”,但是这听起来不正确。

我可以在标题中定义符号并将其包含在所有的头文件中。 这样,如果它们包含我的头文件之一,它们也会得到debugging符号。 现在的问题是,如果他们不想在debugging模式下编译,我的头仍然认为他们在debugging模式。

所以我认为最好的是使用-g被使用时定义的符号,如果有的话!

更新

到目前为止,我得出的结论是我可以做这样的事情:

how_to_build.h

 #if !defined(NDEBUG) #define MY_DEBUG #endif 

用法:

 #include "how_to_build.h" #ifdef MY_DEBUG // rest of the story 

这样, NDEBUG的常见选项也删除了我的定义。 它仍然要求我告诉他们,如果他们不想在debugging模式下得到标题,就定义它。

你可以看到gcc / g ++定义的所有macros的列表,如下所示:

 $ g++ -E -dD -xc++ /dev/null 

例如:

 [max@truth ~]$ g++ -E -dD -xc++ /dev/null > a [max@truth ~]$ g++ -E -dD -xc++ -g -O3 /dev/null > b [max@truth ~]$ diff ab 1a2 > # 1 "/home/max//" 173c174 < #define __NO_INLINE__ 1 --- > #define __OPTIMIZE__ 1 

让我们来看看-g是否定义了一些东西:

 [max@truth ~]$ g++ -E -dD -xc++ -g /dev/null > c [max@truth ~]$ diff ac 1a2 > # 1 "/home/max//" 

额外的预处理器指令,但没有额外的定义为-g标志。

运行
g++ -E -dD -xc++ /dev/null

g++ -E -dD -g -xc++ /dev/null
显示我没有额外的定义符号。

再加上没有任何说明符号被定义的文档,应该足以安全地说没有什么可以定义的。

正如其他人所说,从手册中可以看出,GCC没有提供任何指示是否生成debugging信息的内部macros( -g模式)。 我想补充的是,这是故意的。

很久以前,GCC的原始作者(RMS,Kenner,可能还有其他一些人)认为,启用debugging信息不​​应该对实际代码产生任何改变 ,以减less在尝试debugging时神秘消失的bug的风险它 。 这是海湾合作委员会的基础devise原则,即使在今天,开发人员也不愿意维护它。

定义macros将违反这个devise原则,因为它会允许源代码响应-g而改变自己。