[英]C++ void cast and operator comma in a #define
我在閱讀一些源代碼時發現了這一點。
#define MACRO(x) if((void) 0, (x)); else some_func();
我不完全理解操作符逗號和void轉換背后的原因。 這有可能是與宏觀的保護,我知道(void)0
有時被用來保護級聯else
在宏S,從而為if(...) then foo(); else (void)0
if(...) then foo(); else (void)0
。
為什么運算符逗號有什么想法?
編輯:我開始認為這與貓頭鷹 (0,0)
。
我猜這個技巧用於防止用戶在if
條件中聲明變量。 您可能知道,在C ++中,這樣做是合法的
if (int i = some_func()) {
// you can use `i` here
}
else {
// and you can use `i` here
}
在該定義中使用逗號運算符將阻止宏使用
MACRO(int i = some_func());
並強制用戶僅使用表達式作為參數。
那里的void轉換肯定會阻止調用重載operator ,
因為你不能使用void參數重載。 這保證了(void)0,
沒有效果。
為什么逗號運算符在那里? 一個好問題。 我真的不知道。
這看起來好像有人可能已經開始使用包含assert
一些代碼,對其進行預處理,並將結果轉換為宏。 當定義NDEBUG
, assert
必須變成幾乎沒有 - 但是,從語法上講,仍然必須產生一些占位符代碼。 例如,您可以在以下情況下使用它:
assert(x), *x = 1;
當您使用NDEBUG
定義編譯它時,它仍然需要編譯,但assert
不應該做任何事情。 為了支持這一點, assert
通常定義如下:
#undef assert
#ifdef NDEBUG
#define assert(x) ((void)0)
#else
#define assert(x) ((!!x) || __failassert(x, __FILE__, __LINE__))
#endif
所以,如果某人開始使用上面的代碼,然后查看預處理版本(定義了NDEBUG),他們會看到類似的內容:
((void *)0), *x = 1;
......如果他們不能很好地理解代碼,他們可能會認為((void)0)
真正意味着/完成了某些事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.