以下代碼如何工作?#define LOG_MSG(...)用於調試
#define ENABLE_DEBUG 1
#if ENABLE_DEBUG
#define LOG_MSG printf
#else
#define LOG_MSG(...)
#endif
以下代碼如何工作?#define LOG_MSG(...)用於調試
#define ENABLE_DEBUG 1
#if ENABLE_DEBUG
#define LOG_MSG printf
#else
#define LOG_MSG(...)
#endif
取決於ENABLE_DEBUG
值,LOG_MSG
要麼定義爲爲printf()
的別名,或者它被定義爲無操作宏。這意味着您可以將該值更改爲0
以禁用調試。這是一種常見的技術,可以輕鬆切換顯示大量輸出和釋放安靜的調試版本。
#define LOG_MSG printf
這使得它成爲printf()
的別名。
#define LOG_MSG(...) /* empty */
並且這將其定義爲一個空的宏。請注意,這裏有一組括號,這意味着宏需要參數。它之後什麼都沒有,這意味着它擴展到絕對沒有。 ...
表示該宏可以採用varying number of arguments。此語法是C99擴展,因此可能不適用於較早的C編譯器。
LOG_MSG("file not found\n");
結果是一個LOG_MSG()
呼叫將是打印的消息或者什麼也不做取決於日誌是否啓用。
// If ENABLE_DEBUG is non-zero, a debugging printout:
printf("file not found\n");
// If ENABLE_DEBUG is zero, an empty statement:
;
對於它的價值,無論是誰創作的該宏通過更換第一個定義做了一個更好的工作與使用一個...
語法(他/她顯然是熟悉的),印刷到標準錯誤,而不是stdout:
#define LOG_MSG(...) fprintf(stderr, __VA_ARGS__)
這使用預處理器在編譯之前更改代碼。 如果ENABLE_DEBUG
定義爲1,每當預處理器會看到
LOG_MSG("something happened");
它將與
printf("something happened");
代替它,如果它被定義爲0,或沒有定義它會與沒有取代它(作爲剛剛發表的其他答案說)。