[英]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.