简体   繁体   中英

gcc warning flags for implicit conversions

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; eg:

#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() }; ^ 

您可以使用-Wconversion并避免错误unsigned - 1-Wno-sign-conversion ,如规定在这里

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM