簡體   English   中英

關於const抑制的重言式比較的警告?

[英]Warning about tautological compares inhibited by const?

以下代碼會在GCC和Clang上生成警告:

int main() {
  unsigned n = 0;
  return ( n < 0 ) ? 1 : 0;
}

警告是:

$ g++-4.7 -std=c++11 -O3 -Wall -Wextra t.cc -o t
t.cc: In function ‘int main()’:
t.cc:3:16: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
$ clang++-3.2 -std=c++11 -O3 -Wall -Wextra t.cc -o t
t.cc:3:14: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
  return ( n < 0 ) ? 1 : 0;
           ~ ^ ~
1 warning generated.
$ 

到現在為止還挺好。 現在我將變量更改為const

int main() {
  const unsigned n = 0;
  return ( n < 0 ) ? 1 : 0;
}

兩個編譯器都很高興在沒有警告的情況下編譯代碼:

$ g++-4.7 -std=c++11 -O3 -Wall -Wextra t.cc -o t
$ clang++-3.2 -std=c++11 -O3 -Wall -Wextra t.cc -o t
$ 

問題:為什么會這樣? 有沒有理由 ,為什么const變量會抑制警告? 如果GCC和Clang都同意,我會毫不猶豫地向他們發送錯誤報告,因為我似乎更有可能需要學習一些東西:)

編輯:編譯器的常量折疊可能與它有關,但它不足以解釋行為 在第一個示例中(沒有const ),編譯器確實知道了值並且它永遠不會改變。 我檢查了匯編器輸出,並且編譯器確實進行了常量折疊但它仍然生成警告,可能它看到表達式( n < 0 )並且知道n是無符號類型時用已知常量替換變量之前 那說:當我添加const時,為什么這種行為會改變? 我認為如果第一個例子產生警告,也應該可以為第二個例子生成警告。

這是一個明確的常數 - 你的意圖 您所需的警告有效地從以下方面轉移

warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
return ( n < 0 ) ? 1 : 0;
         ~ ^ ~

const時的-Wunreachable-code

warning: will never be executed [-Wunreachable-code]
return ( n < 0 ) ? 1 : 0;
                   ^

注意: -Wtautological-compare編譯器仍可能發出了-Wtautological-compare警告,其中值未知。

當變量不是const ,它可能會改變,編譯器不知道它。 這就是警告的原因。 如果它是const ,它將永遠不會改變。 這樣,編譯器可以代替任何occurence n與實際值n ,在這種情況下:

return ( 0 < 0 ) ? 1 : 0;
-> return 0;

因此,沒有警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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