使用#ifdef <macro> <statement> #endif允許僅在開發期間顯示詳細訊息,并且非常方便。我想知道下面的代碼是否可能,變得更短:
// pseudo-code:
#define IN_DEV
#define DEBUG_ONLY(statement) (#ifdef IN_DEV (statement) #endif)
int main(void)
{
DEBUG_ONLY(printf("hello from debug mode\n");)
//...
}
這只會花費我一個非常易讀的單線,可以打開或關閉。像這樣/接近這個可能嗎?
uj5u.com熱心網友回復:
將整個運算式作為引數傳遞給宏沒有多大意義。這既危險又無法維護。更糟糕的是,它讓我們走上了“讓我們發明自己的私有宏語言而不是使用任何人都能理解的可讀 C”的混淆之路。即使出于除錯目的,這也是一個糟糕的主意。
更明智的方法是一個類似函式的列印宏,它只在除錯版本中列印一些東西。
#ifdef INDEV
#define DEBUG_PRINT(...) printf(__VA_ARGS__)
#else
#define DEBUG_PRINT(...)
#endif
int main(void)
{
DEBUG_PRINT("hello from debug mode\n");
}
可以選擇將此宏縮小為僅接受字串并使其型別更安全(僅限 C17):
#ifdef INDEV
#define DEBUG_PRINT(str) _Generic((str), char*: puts(str))
#else
#define DEBUG_PRINT(str) _Generic((str), char*: (void)0)
#endif
uj5u.com熱心網友回復:
您可以更改DEBUG_ONLY依賴的含義ifIN_DEV已定義:
// pseudo-code:
#ifdef IN_DEV
#define DEBUG_ONLY(statement) {statement}
#else
#define DEBUG_ONLY(statement) // Nothing
#endif
int main(void)
{
DEBUG_ONLY(printf("hello from debug mode\n");)
//...
}
運行示例:鏈接
uj5u.com熱心網友回復:
這是不可能的。您不能#if在宏定義中使用。
你可以做的是:
#define IN_DEV
#ifdef
#define DEBUG_ONLY(statement) (statement)
#else
#define DEBUG_ONLY(statement)
#endif
int main(void)
{
DEBUG_ONLY(printf("hello from debug mode\n");)
//...
}
這也可以只用一個宏來切換IN_DEV。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356329.html
上一篇:如何顯示和添加所有偶數?
