2009-10-13 5 views
1

Можно создать дубликат:
Make VS compiler catch signed/unsigned assignments?Назначение для разных типов данных в C++

я составил следующий фрагмент кода в VC++ 2005/2008:

unsigned long ul = ...; 
signed long l = ...; 

l = ul; 

и ожидал увидеть предупреждение компилятора (уровень предупреждения установлен на 4), но никто не был сгенерирован. Я пропустил что-то очевидное здесь?

Благодаря

+1

Единственный ответ заключается в том, что каждый отдельный компилятор должен сгенерировать предупреждения. И, видимо, команда VC++ не думала, что это предостерегает. – jalf

ответ

1

Я думаю, что это дубликат (here).
Цитирование принятый ответ:

Вам необходимо включить предупреждение 4365 поймать назначение.
Это может быть сложно - вам нужно включить ВСЕ предупреждения - используйте/Стена, которая позволяет много предупреждений, поэтому у вас могут возникнуть проблемы с обнаружением предупреждения, но это так. (quamrana)

Вы также можете использовать предупреждение #pragma (по умолчанию: 4365) для включения. (ChrisN)

+0

Спасибо. Они, безусловно, неплохо спрятали этот вариант! – 2009-10-13 15:15:54

2

Если опущенные Инициализаторы константы времени компиляции, статический анализатор может быть в состоянии определить, что нет переполнения не может произойти, и пусть это слайд без предупреждения. Попробуйте инициализировать ul для чего-то> 2^31 -1 и посмотреть, что произойдет (если вы на 32-битной платформе).

+0

Я бы на самом деле пробовал это раньше. Никакие предупреждения не генерировались независимо от того, какое значение границы было инициализировано ul. – 2009-10-13 11:21:04

1

Предупреждения специфичны для компилятора. Вы должны «видеть» предупреждение в том смысле, что «это поможет вам», но команда Visual C++ не решила отображать один по умолчанию.

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