很快,我想知道 gcc (或 g++。我需要它C,但也对 c++ 感到好奇)定义了任何特殊符号,如果-g
已启用。可以?如果是的话,是什么符号?
在搜索过程中我发现:
-
_DEBUG
是手动定义的(手动我的意思是-D_DEBUG
)并且是 Visual C 程序员的一个习惯(因为 VC 定义了_DEBUG
在调试模式下编译时)
-
NDEBUG
如果不在调试模式下则定义。虽然我发现有几个地方这么说,但我尝试在 .c 和 .cpp 文件中使用 gcc 和 g++,但没有一个有或没有-g
没有定义这样的符号!
Edit:让我演示一下为什么我不想使用非标准符号:
想象一个内核模块,它执行某些操作,并且还提供要包含在其他内核模块中的头文件,以便它们可以连接到该模块。
现在作为一种工具,在我的一个头文件中:
#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
我自己,但是如果有人包含我的标题,他们可能不会定义该符号。当然,我可以告诉他们“顺便说一句,要在调试模式下获取标头,请定义另一个符号”,但这对我来说听起来不太正确。
我可以在标头中定义符号并将其包含在所有标头文件中。这样,如果它们包含我的标头之一,它们也会获得调试符号。现在的问题是,如果他们don't想在调试模式下编译,我的标头仍然认为它们处于调试模式。
所以我认为最好是使用一个在以下情况定义的符号-g
被使用过,如果有的话!
Update
到目前为止,我得出的结论是我可以做这样的事情:
如何构建.h
#if !defined(NDEBUG)
#define MY_DEBUG
#endif
Usage:
#include "how_to_build.h"
#ifdef MY_DEBUG
// rest of the story
这样,常见的选择是NDEBUG
也删除了我的定义。如果他们不想在调试模式下获取标头,它仍然需要我告诉他们定义它。