我正在编写一个包含Codeblocks的C ++程序,出于调试目的,我需要知道Codeblocks的Building-Target是设置为“DEBUG”还是“RELEASE”。
我已经尝试过了:
#ifdef DEBUG
printf("Debug-Message");
#endif
和这个
#ifdef _DEBUG
printf("Debug-Message");
#endif
但这些词都没有定义。 我是否必须自己定义DEBUG并更改它,每次更改Building-Target时,或者是否有一个我不知道的单词?
答案 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}}的特定定义。