2012-10-20 112 views
4

我正在编写带有代码块的C++程序,并且为了调试目的,我需要知道代码块的构建目标是否设置为“DEBUG”或“RELEASE”。代码块调试预处理器

我已经尝试过这样的:

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

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

但这一切的话来定义。 我是否必须自己定义DEBUG并更改它,每当我更改构建目标时,还是存在一个我不知道的词?

+0

不要忘记用'\ n'结束你的调试格式字符串。 –

回答

3

我是否必须自己定义DEBUG并更改它,每当我更改建筑目标 或者有一个词我不知道?

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

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

你没有改变他们为你构建目标(DEBUG或RELEASE)之间切换。它允许您定义特定于Debug版本的值以及特定于Release版本的值。

为了避免每次为每个新项目手动输入,您可以使用调试/发布#define创建一个小项目,并将其另存为项目模板,然后从该项目模板创建新项目。

+0

CodeBlocks应该自它的调试/释放感知以后真的应该定义这些字符串。在调试配置下,它应该将'assert'的行为从'abort'改为'trap'。在调试器中“放弃”程序绝对没有意义。我很惊讶有多少人因为委员会的愚蠢决定而没有使用“assert”。 – jww

3

的常用方法,如通过assert(3)手册页和习惯(在C <assert.h><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 <<具体定义为我种的优势。