#define DEBUG 1

我正在尝试调试模式,如果

#define DEBUG 1 

我想printf一些变量值和if

 #define DEBUG 0 

我希望他们离开

问题是我有很多实现文件,我希望这个DEBUG变量可用于整个项目。 现在我需要在foo1.c,foo2.c,foo3.c中编辑DEBUG变量,这似乎很乏味且容易出错,而且必须有更好的方法。 有什么建议?

编译时,您应该能够为编译器指定一个选项。 例如,您可以使用-DDEBUG选项调用GCC。

在这种情况下,您最好使用:

 #ifdef DEBUG #endif 

要么:

 #if defined(DEBUG) #endif 

如果这不是你现在这样做的方式。 我很惊讶你的项目没有全局头文件。 有点像:

 #ifdef DEBUG #undef DEBUG #endif #define DEBUG 1 

在名为“debug.h”的文件中。 在C程序中,可以使用#include "debug.h"来包含它。

尝试像Steve McConnel在Code Complete 2的“第8章:防御性编程”第6节中所建议的那样……将其添加到您的代码中:

 #ifdef DEBUG #if (DEBUG > 0) && (DEBUG < 2) printf("Debugging level 1"); #endif #if (DEBUG > 1) && (DEBUG < 3) printf("Debugging level 2"); #endif #if (DEBUG > n-1) && (DEBUG < n) printf("Debugging level n"); #endif #endif 

然后在编译时添加此标志(警告:这可能与编译器有关):

 -DDEBUG=m 

或者,有一个全局标题定义了这些类型的东西,正如其他人所建议的那样。

作为对您的问题的回答,您还可以简单地调用编译器,如:

 cc -c -DDEBUG=1 

要么

  cc -c -DDEBUG=0 

您必须删除文件中的“define DEBUG 1/0” – 或将其替换为:

 #ifndef DEBUG #define DEBUG 0 #endif 

这是我正在使用的(GCC语法):

  • 使用以下内容创建一个文件debug.h并将其包含在每个c文件中:

     #ifdef DEBUG extern FILE *dbgf; #define D_MIN 0x00010000 // Minimum level #define D_MED 0x00020000 // Medium level #define D_MAX 0x00040000 // Maximum level #define D_FLUSH 0x00080000 // Usefull by a program crash #define D_TRACE 0x00100000 #define D_1 0x00000001 ... #define D(msk, fmt, args...) if(msk & dbgmsk) { fprintf(dbgf, "%s:",__FUNCTION__); fprintf(dbgf, fmt, ## args ); if(msk & D_FLUSH) fflush(dbgf); } #define P(msk, fmt, args...) if(msk & dbgmsk) { fprintf(dbgf, fmt, ## args ); if(msk & D_FLUSH) fflush(dbgf); } #else #define D(msk, fmt, args...) #define P(msk, fmt, args...) #endif 

dbgmsk是变量,可以是全局(整个程序)或本地/静态,必须初始化为start。 您可以为整个程序或每个模块定义多个选项。 这比具有级别变量的版本更好,更灵活。

防爆。 module1.c:

 #include "debug.h" static int dbgmsk; // using local dbgmsk module1_setdbg(int msk) { dbgmsk = msk; D(D_TRACE,"dbgmsk1=%x\n", dbgmsk); } foo1() { P(D_1, "foo1 function\n" ); .... } foo2() {} ... 

foo3.c

 #include "debug.h" extern int dbgmsk; // using global dbgmsk 

防爆。 主要:

 #include "debug.h" FILE *dbgf; int dbgmsk = 0; // this is the global dbgmsk int main() { dbgf = stderr; // or your logfile dbgmsk = D_MIN; module1_setdbg(D_MIN|D_MED|D_TRACE|D_1); .... } 

我还将所有dbgmsk变量存储在程序启动时读取的配置文本文件中。

将“#define DEBUG”放在“debug.h”中,并在每个* .c文件中#include该头文件。

正如@ person-b所说,将此define指定为编译器选项,例如-D DEBUG

请注意,为了简化此操作,您应该更改代码中的测试:

 #if DEBUG 

至:

 #ifdef DEBUG 

这样您就不必担心指定0或1值,而是可以依赖于它的定义与否。

samoz和Stephen Doyle建议检查是否存在DEBUG定义而不是其值,这是一个很好的建议。 但是,如果您确实想使用DEBUG = 0,则可以这样做:每次定义DEBUG标志(即在每个文件中)时,检查现有定义:

 #ifndef DEBUG #define DEBUG 1 #endif 

然后,当您在编译器中使用-DDEBUG = 0选项时,将永远不会执行#define行。

试试这个。

在第一个文件中,您将包括:

 #define DEBUG 

然后,只要您想要调试代码,请执行以下操作:

 #ifdef DEBUG do some stuff #endif 

这也将阻止您的调试代码进入发布代码。

我个人喜欢

 #ifdef DEBUG
 #define IFDEBUG if(0)else
 #其他
 #define IFDEBUG if(1)else
 #万一