2016-03-07 2 views
10

Я недавно была ошибка в подобном контексте к следующему:НКУ предупреждающие флаги для неявных преобразований

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

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

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

+0

Это фактически 'double' →' char' → 'string' conversion. Первый можно поймать '-Wfloat-conversion', который также включен' -Wconversion' –

+0

@Revolver_Ocelot. Спасибо, этот флаг, похоже, тот, который я ищу. К сожалению, он недоступен в GCC 4.8.2 – Felics

+0

@ DieterLücking Я указал в вопросе, что я не могу использовать -Wconversion, потому что я получаю много ошибок для неподписанных - 1 подобных конструкций во многих включенных заголовках. – Felics

ответ

5

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

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

Это не помогает с 'str = getSomeValue();', который является назначением, а не инициализация (Предположительно, в коде OP есть случаи, когда назначение происходит через некоторое время после того, как переменная уже используется, поэтому ее нельзя заменить инициализацией) –

+0

@MM: Возможно, в таких случаях для OP может работать что-то подобное: 'str = std :: string {getSomeValue()};'. Во всяком случае, я считаю использование «-Wconversion» хорошим вариантом. –

Смежные вопросы