[英]Proper way to print different debug messages in C?
使用和不使用DEBUG標志進行編譯時,我需要打印msg1和msg2以獲得相同的錯誤。 例如
fprintf( stderr,
#ifdef DEBUG
"error msg1 %s",__FILE__
#else
"error msg2"
#endif
);
或其他方式可能是將這些msg1
和msg2
傳遞給函數並使用vfprintf()
打印它。 第二種方法可能會產生運行時開銷。 因此,我只是想知道有什么更好的方法?
例如,一個用例可能是代碼需要使用info
和debug
標志進行編譯。 info
可能是用戶相關的消息和debug
用於調試的目的。 有什么建議么?
通常,在代碼中使用跟蹤來幫助調試它,例如,在NULL指針測試中,您可以添加smth,例如if (ptr==NULL) DEBUG("Entering Null pointer");
。 我只是告訴你,因為我不理解為什么你要同時使用msg1
和msg2
。
對我來說,我通常使用宏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.