предупреждающие флаги gcc для неявных преобразований

недавно у меня была ошибка в аналогичном контексте к следующему:

double getSomeValue()
{
    return 4.0;
}
...
std::string str;
str = getSomeValue();

как вы можете видеть, здесь легко обнаружить проблему, но в большой базе кода, где getSomeValue() не находится в одном файле с вызывающим кодом, это может быть трудно определить double to std::string автоматической конвертации. GCC компилирует этот код отлично с -Wall -Wextra -Werror (пример вывода здесь, я не знаю, какие предупреждающие флаги были использованы:http://ideone.com/BTXBFk).

как я могу заставить GCC выдавать предупреждения для этих опасных неявных преобразований? Я пытался!--5-->, но он очень строг и вызывает ошибки в большинстве включенных заголовков для общих случаев, таких как unsigned - 1. Есть ли более слабая версия -Wconversion?

2 ответов


можно использовать -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: 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, как указано здесь.