在C中打印不同调试消息的正确方法?

时间:2016-12-25 16:54:32

标签: c debugging stderr

在使用和不使用DEBUG标志编译时,我需要打印msg1和msg2以获得相同的错误。 E.g。

      fprintf( stderr,
#ifdef DEBUG
                      "error msg1 %s",__FILE__
#else
                      "error msg2"
#endif
              );

或其他方式可能是将这些msg1msg2传递给函数并使用vfprintf()进行打印。 可能,第二种方法会产生运行时开销。所以,我只是想知道这可能是更好的方法吗?

E.g。用例可能是代码需要使用infodebug标志进行编译。 info可能是与用户相关的消息,debug可能是出于调试目的。 有什么建议?

3 个答案:

答案 0 :(得分:2)

通常在代码中使用跟踪来帮助调试它,因此例如在您的NULL指针测试中,您可以添加类似if (ptr==NULL) DEBUG("Entering Null pointer");的smth。我只是告诉你,因为我不喜欢和你为什么要同时使用msg1msg2

对我来说,我通常使用宏DEBUG和全局变量verbose

#define DEBUG(...)\
if(verbose && SHOW_ERROR) {\
printf("Error : %s, %d",__FUNCTION__, __LINE__);\
printf(__VA_ARGS__);\
}\
else if (verbose && SHOW_WARNING) {\
printf("Warning : %s, %d",__FUNCTION__, __LINE__);\
printf(__VA_ARGS__);\
}

示例:

#include <stdio.h>

#define SHOW_ERROR 1
#define SHOW_WARNING 2

int verbose = 1; 
int main()
{
  DEBUG("THIS WILL SHOW ERROR MSG");
  verbose = 2;
  DEBUG("THIS WILL SHOW WARNING MSG");
}

希望我能帮忙。

答案 1 :(得分:1)

vfprintf的无条件调用确实带来了一些额外的开销,用于打包额外参数a,以便与变量参数列表函数一起使用。此外,条件编译允许编译器注意到fprintf模式下DEBUG的调用不传递格式字符串以外的参数,并将其替换为fputs("error msg1", stderr) *

然而,这种开销很小,你不太可能注意到它的任何一个,因为写作无条件地发生,并且它将主导呼叫的时间。

* DEBUG输出提供较少的详细信息比非调试的少得多;通常,情况正好相反。

答案 2 :(得分:1)

您的调试标志是预处理器宏,因此将在编译时选择错误消息,这是您想要的行为吗?

我建议采用略有不同的方法:

dbg

可以在运行时打开和关闭#define PRINT_INFO_VAR(msg1,msg2...) if(dbg){fprintf(stderr,msg1);}\ else{fprintf(stderr,msg2);} 标志

您可以使用variadic macros

进行更多游戏
PRINT_INFO_VAR(msg1,msg2,a)

对于你给出的例子,它看起来像这样:

 class TMyClass
 {
 private:
     int FMyFoo1;

     int GetMyFoo2();
     void SetMyFoo2(int AMyFoo2);

 public:
     __property int MyFoo1 = {read=FMyFoo1, write=FMyFoo1};
     __property int MyFoo2 = {read=GetMyFoo2, write=SetMyFoo2};
 };