DEBUG在代码中的定义在哪里?

时间:2011-06-24 08:55:44

标签: c++

我查看了一个示例代码,以便在我的服务器上创建一个日志系统......我发现了这个

#if DEBUG
printf("something here");
#endif

我知道它的作用。只有在DEBUG被定罪的情况下它才能发挥作用。但DEBUG定义在哪里?我看了所有的头文件,但我找不到DEBUG ..

另外,您能否为我提供一个关于设计日志系统的好例子或教程?

提前致谢..

4 个答案:

答案 0 :(得分:10)

不要使用C ++标准未定义的DEBUG宏。 C ++标准定义NDEBUG(无DEBUG),它用于标准assert宏,您的日志代码将与它一起使用。 DEBUG依赖于编译器。因此,NDEBUG由标准确保正确设置。将它应用于您的示例使用:

#ifndef NDEBUG
printf("something here");
#endif

但我的意见是:您不应该围绕NDEBUG / DEBUG对设计一个日志库。记录lib应始终存在,只是为了允许您跟踪应用程序的行为而无需重新编译代码,这反过来又涉及代码的新部署以及推迟容易出错的行为的可能性。 Petru Marginean关于日志库设计的以下DDJ文章描述了如何在C ++中以非常有效的方式确保这一事实:

第1部分:http://drdobbs.com/cpp/201804215

第2部分:http://drdobbs.com/cpp/221900468

关于日志库,请查看Boost Logging库:

http://boost-log.sourceforge.net/libs/log/doc/html/index.html


我被低估了,因为如果没有在命令行中明确定义NDEBUG,就说不会设置NDEBUG。我同意这个事实,但另一方面,我在这里理解这个问题,在调试模式下编译,也应该产生日志输出。将行为捆绑到NDEBUG状态时,可以更好地执行此事实。

答案 1 :(得分:6)

编译器,至少我所知道的,可以选择从编译文件的“外部”定义预处理器宏。

例如,要使用Microsoft软件编译器定义DEBUG,您可以使用类似

的内容
cl -DDEBUG file.cpp ...

答案 2 :(得分:2)

检测第一个定义位置的简便方法,您可以添加#define。

#include "someone.h"

#define DEBUG "dummy" // add this

#if DEBUG
printf("something here");
#endif

你会得到

foo.c:2:0: warning: "DEBUG" redefined
<command-line>:0:0: note: this is the location of the previous definition

或者

foo.c:30:0: warning: "DEBUG" redefined
someone.h.c:2:0: note: this is the location of the previous definition

另一个答案,尝试使用ctags。在项目目录的顶部运行ctasg -R,运行vim /path/to/your/code.c。将光标移至DEBUG,然后键入CTRL-]

这样,您可以找到几个定义。您可以在:tselect上找到DEBUG的所有内容。

答案 3 :(得分:1)

在Visual Studio中,您可以在“项目属性”中设置“预处理程序符号”。至于日志系统,请查看log4cpp