更新时间:2022-10-15 17:12:10
您可以使用 -Wfloat-conversion
标志或更广泛的 -Wconversion
。
但是,请注意,使用C ++ 11 统一初始化大括号语法时,您会收到开箱即用的警告,但不包含 -Wconversion
标志;例如:
#include< string>
double getSomeValue(){
return 4.0;
int main(){
std :: string str {getSomeValue()}; // C ++ 11 brace-init
}
C:\Temp\CppTests> g ++ -std = c ++ 11 test.cpp
test.cpp:在函数'int main()'中:
test.cpp:8:35:warning:缩小'getSomeValue()'从'double'的转换时间t $ b $'char'内部{} [-Wnarrowing]
std :: string str {getSomeValue() };
^
I recently had a bug in a similar context to next one:
double getSomeValue()
{
return 4.0;
}
...
std::string str;
str = getSomeValue();
As you can see here is easy to spot the problem, but in a large code base where getSomeValue()
is not in the same file with the calling code it might be difficult to spot this double
to std::string
silent conversion. GCC compiles this code fine with -Wall -Wextra -Werror
(sample output here, I don't know what warning flags were used: http://ideone.com/BTXBFk).
How may I force GCC to emit warnings for these dangerous implicit conversions? I tried -Wconversion
, but it is very strict and it causes errors in most included headers for common cases like unsigned - 1
. Is there a weaker version of -Wconversion
?
You can use the -Wfloat-conversion
flag, or the broader -Wconversion
.
However, note that with C++11 uniform initialization brace syntax, you get a warning "out of the box", without the -Wconversion
flag; e.g.:
#include <string>
double getSomeValue() {
return 4.0;
}
int main() {
std::string str{ getSomeValue() }; // C++11 brace-init
}
C:\Temp\CppTests>g++ -std=c++11 test.cpp test.cpp: In function 'int main()': test.cpp:8:35: warning: narrowing conversion of 'getSomeValue()' from 'double' t o 'char' inside { } [-Wnarrowing] std::string str{ getSomeValue() }; ^