代码块调试预处理器

时间:2012-10-20 10:48:37

标签: c++ codeblocks c-preprocessor

我正在编写一个包含Codeblocks的C ++程序,出于调试目的,我需要知道Codeblocks的Building-Target是设置为“DEBUG”还是“RELEASE”。

我已经尝试过了:

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

和这个

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

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

2 个答案:

答案 0 :(得分:5)

  

我是否必须自己定义DEBUG并在每次更改时更改它   建筑目标,还是有一个我不知道的词?

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

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

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

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

答案 1 :(得分:3)

通常的方式,如assert(3)手册页和习惯(C中为<assert.h>或C ++中为<cassert>)所示,是在命令行定义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__,也可以使用#ifndef NDEBUG #define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \ << " " << Out << std::endl;}while(0) #else #define DBGOUT(Out) do{}while(0) #endif 你喜欢)。在纯C ++代码中,我可能会改为

DBGOUT("i=" << i)

并使用operator <<,以便为我的类型使用{{1}}的特定定义。