2015-07-16 2 views
4

Как предотвратить это неявное преобразование типа между int и std :: string, что очень сильно подвержено ошибкам. Вот код.преобразование типа implict между int и строкой

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string s="string"; 
    s = 123456789; //assign a int value to std::string 
    cout << s; 
    // your code goes here 
    return 0; 
} 

Вышеприведенный код может быть скомпилирован без предупреждения, и результат явно не соответствует коду. Можно ли этого избежать?

Обновление: 123456789 будет вызывать предупреждение о переполнении, если установлен флаг -Wall. Но если я перейду на s = 98, больше не будет предупреждений. но я действительно хочу, чтобы строка была строкой 98, а не символом ascii b. Как это предотвратить?

+0

какой компилятор вы используете? Я получаю предупреждение с моим g ++ 4.7 –

+0

Вот почему мы всегда компилируем с включенными предупреждениями и замечаем их: 'warning: неявное преобразование из 'int' в 'char' изменяет значение с 123456789 до 21 [-Wconstant-conversion ] s = 123456789; ' –

+0

Сообщите нам, что вы используете. – 101010

ответ

4

Насколько я понимаю, вам нужно предупредить, если произойдет что-то подобное. Для этого вам необходимо включить все предупреждения. Добавьте флаг -Wall -Wextra во время компиляции.

Однако в этом конкретном случае вам не нужны эти флаги. Если вы не отключили предупреждения, вы должны получить предупреждение implicit type conversion.

Как указано в комментариях, чтобы включить предупреждение специально для этого случая, вы можете использовать флаг -Wconstant-conversion.

+1

Или более конкретно:' -Wconstant-conversion' –

+0

@ ПолР: Спасибо за это. Раньше этого не знал. – therainmaker

+0

Кажется, что '-Wconstant-conversion' не поддерживается моим старым компилятором. –

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