6

我正在编写一个带有代码块的 C++ 程序,出于调试目的,我需要知道代码块的构建目标是否设置为“DEBUG”或“RELEASE”。

我已经尝试过了:

#ifdef DEBUG
    printf("Debug-Message");
#endif

还有这个

#ifdef _DEBUG
    printf("Debug-Message");
#endif

但是这些词都没有定义。我是否必须自己定义 DEBUG 并更改它,每次更改 Building-Target 时,还是有一个我不知道的词?

4

2 回答 2

6

我是否必须自己定义 DEBUG 并更改它,每次更改 Building-Target 时,还是有一个我不知道的词?

我不知道 Code::Blocks 是否默认设置了什么。但是,如果您定义自己的#defines

Project->Build options...->[Debug|Release]->#defines 

在构建目标(DEBUG 或 RELEASE)之间切换时,您不必更改它们。它允许您定义特定于 Debug 构建的值,以及特定于 Release 构建的值。

为了避免每次为每个新项目手动输入它,您可以只使用 Debug/Release #defines 创建一个小项目并将其保存为项目模板,然后从该项目模板创建新项目。

于 2012-10-20T11:46:43.040 回答
3

通常的方法,如assert(3)手册页和习惯(<assert.h>在 C 或<cassert>C++ 中)所建议的那样,是NDEBUG在命令行定义gcc -Wall -DNDEBUG非调试编译(例如用 编译)。在Makefile你可以CPPFLAGS += -DNDEBUG在发布模式下(并g++ -Wall -g在调试模式下编译)。

我自己的习惯可能是有类似的东西

#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
                               __FILE__, __LINE__, \ 
                              ##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif

在一个通用的头文件中,并dbgprintf("i=%d", i)在代码的其他地方使用。请注意,我在宏参数上使用了常量字符串连接Fmt,我在它后面附加了一个常量换行符,并且我的调试输出包含源文件名和行号(__func__ 如果你愿意,你也可以使用)。在纯 C++ 代码中,我可能有

#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
                       << " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif

并使用对我的类型DBGOUT("i=" << i)使用特定定义的优势。operator <<

于 2012-10-20T10:51:52.283 回答