Назначение между типами данных в C ++ [дубликат]

Возможный дубликат:
Сделать компилятор VS перехватывать подписанные / неподписанные назначения?

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

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

l = ul; 

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

Спасибо

13.10.2009 10:17:34
единственный ответ заключается в том, что генерировать предупреждения должны только отдельные компиляторы. И, видимо, команда VC ++ не думала, что это оправдывает предупреждение.
jalf 13.10.2009 12:49:55
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

1
23.05.2017 12:13:37
Спасибо. Они, конечно, сделали хорошую работу, скрывая эту опцию!
user188998 13.10.2009 15:15:54

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

2
13.10.2009 10:26:32
Я действительно пробовал это раньше. Предупреждения не генерировались независимо от того, к какому значению границы был инициализирован
user188998 13.10.2009 11:21:04

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

1
13.10.2009 14:49:59