我查看了一个示例代码,以便在我的服务器上创建一个日志系统......我发现了这个
#if DEBUG
printf("something here");
#endif
我知道它的作用。只有在DEBUG被定罪的情况下它才能发挥作用。但DEBUG定义在哪里?我看了所有的头文件,但我找不到DEBUG ..
另外,您能否为我提供一个关于设计日志系统的好例子或教程?
提前致谢..
答案 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