[英]Need help regarding macro definition
我正在閱讀c ++代碼,我已經找到了這樣的定義
#define USE_VAL(X) if (&X-1) {}
有什么想法,這是什么意思?
根據名稱,它看起來像是一種擺脫“未使用的變量”警告的方法。 預期用途可能是這樣的:
int function(int i)
{
USE_VAL(i)
return 42;
}
如果沒有這個,你可以得到一個編譯器警告,在函數內部沒有使用參數i
。
然而,這是一種相當危險的方法,因為它在代碼中引入了未定義的行為(超出實際數組邊界的指針算法是標准的Undefined)。 可以將 1 添加到對象的地址,但不能減去1.當然,使用+ 1
而不是- 1
,編譯器可以警告“條件始終為真”。 優化器可能會刪除整個if
並且代碼仍然有效,但優化器在利用“未定義的行為不可能發生”方面正在變得更好,這實際上可能會非常意外地搞亂代碼。
更不用說operator&
所涉及的類型可能過載的事實,可能導致不希望的副作用。
有更好的方法來實現這樣的功能,例如轉換為void
:
#define USE_VAL(X) static_cast<void>(X)
但是,我個人的偏好是在函數定義中注釋掉參數的名稱,如下所示:
int function(int /*i*/)
{
return 42;
}
這樣做的好處是它實際上可以防止您在將參數傳遞給宏后意外使用該參數。
通常,這是為了避免“未使用的返回值”警告。 即使通常的“cast to void”習慣通常適用於未使用的函數參數,當忽略fread
等函數的返回值時, gcc
with -pedantic
也特別嚴格(通常,標記為__attribute__((warn_unused_result))
函數),所以一個“假的if
”經常被用來欺騙編譯器認為你正在使用返回值做某事。
宏是一個預處理器指令,意味着無論在何處使用,它都將被相關的代碼片段替換。
在USE_VAL(X)之后,它解釋了USE_VAL(X)會做什么。
首先它取x的地址然后從中減去1。 如果是0那么什么也不做。
USE_VAL(X)將使用的地方將替換為if(&X-1){}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.