代码块调试预处理器

Codeblocks debug preprocessor

本文关键字:处理器 预处理 调试 代码      更新时间:2023-10-16

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

我已经试过了:

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

而这个

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

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

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

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

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

在生成目标(调试或发布)之间切换时,不必更改它们。它允许你定义特定于调试版本的值,以及特定于发布版本的值。

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

通常的方法, 正如 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__)。在纯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 <<定义。