当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
而改变自己。