簡體   English   中英

在C中打印不同調試消息的正確方法?

[英]Proper way to print different debug messages in C?

使用和不使用DEBUG標志進行編譯時,我需要打印msg1和msg2以獲得相同的錯誤。 例如

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

或其他方式可能是將這些msg1msg2傳遞給函數並使用vfprintf()打印它。 第二種方法可能會產生運行時開銷。 因此,我只是想知道有什么更好的方法?

例如,一個用例可能是代碼需要使用infodebug標志進行編譯。 info可能是用戶相關的消息和debug用於調試的目的。 有什么建議么?

通常,在代碼中使用跟蹤來幫助調試它,例如,在NULL指針測試中,您可以添加smth,例如if (ptr==NULL) DEBUG("Entering Null pointer"); 我只是告訴你,因為我不理解為什么你要同時使用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");
}

希望我能幫上忙。

vfprintf的無條件調用vfprintf會帶來一些額外的開銷,用於打包用於可變參數列表函數的額外參數a 此外,條件編譯使編譯器可以注意到在DEBUG模式下對fprintf的調用未傳遞除格式字符串之外的其他參數,而將其替換為fputs("error msg1", stderr) *

但是,這種開銷很小,您幾乎不可能注意到任何開銷,因為寫操作是無條件進行的,並且它將主導呼叫的時間。

* DEBUG輸出提供的信息比非調試信息少的情況很少見; 通常情況是相反的。

您的調試標志是預處理器宏,因此將在編譯時選擇錯誤消息,這是您想要的行為嗎?

我建議一種稍微不同的方法:

#define PRINT_INFO(msg1,msg2) if(dbg){fprintf(stderr,msg1);}\
                              else{fprintf(stderr,msg2);}

可以在運行時打開和關閉dbg標志的位置

您可以使用可變參數宏進行更多操作:

#define PRINT_INFO_VAR(msg1,msg2...) if(dbg){fprintf(stderr,msg1);}\
                                     else{fprintf(stderr,msg2);}

對於您給出的示例,它看起來像這樣:

PRINT_INFO_VAR(msg1,msg2,a)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM