предупреждающие флаги 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
, как указано здесь.