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

use*_*799 8 c++

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

#if DEBUG
printf("something here");
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢..

ova*_*nes 11

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

#ifndef NDEBUG
printf("something here");
#endif
Run Code Online (Sandbox Code Playgroud)

但我的意见是:你不应该在NDEBUG/ DEBUGpair 周围设计一个日志库.记录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状态时,这个事实会更好地执行.

  • 我不同意你的看法.构建过程通常是有组织的,以便NDEBUG正常工作,否则断言宏是无用的. (2认同)

Ren*_*ger 6

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

例如,要DEBUG使用微软编译器进行定义,您可以使用类似的东西

cl -DDEBUG file.cpp ...
Run Code Online (Sandbox Code Playgroud)