Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать флаг -Wfloat-conversion или более широкий -Wconversion.

Однако обратите внимание, что при синтаксисе синтаксиса синтаксиса синтаксиса С++ 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() };
                                   ^