簡體   English   中英

#define中的C ++ void cast和operator逗號

[英]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一些代碼,對其進行預處理,並將結果轉換為宏。 當定義NDEBUGassert必須變成幾乎沒有 - 但是,從語法上講,仍然必須產生一些占位符代碼。 例如,您可以在以下情況下使用它:

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.

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