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

G++ предупреждает, когда double/float преобразуется в целое число без знака без использования -Wconversion

Возможный дубликат:
g++ - не предупреждать о double- > int cast

В вопросе здесь прямое преобразование из double/float в unsigned integer не переносится. Я обнаружил, что у меня было несколько случаев в моем коде, где это происходит, и я хотел бы сказать g++, чтобы предупредить меня, если это произойдет, но я не могу найти такой вариант. Кто-нибудь знает, есть ли возможность сделать это?

Примечание. Я вижу -Wconversion, но также предупреждает обо всех других преобразованиях, которые мне не нужны (например, преобразование int в unsigned int, которое переносимо для стандарта).

Изменить: Вот пример кода, для которого я хотел бы видеть предупреждение:

double dblNumber = -234;
unsigned long uintNumber = dblNumber;

В одной версии g++ это дает целочисленное значение 0xFFFFFF16 (что составляет -234 в 2 дополнениях). С другой стороны, это дает мне 0. Очевидно, что код неоднозначен, поэтому он по понятным причинам не считается переносимым.

4b9b3361

Ответ 1

Когда выполняется принудительное преобразование с плавающей точкой в ​​int, и усеченное значение не может соответствовать типу назначения, тогда поведение undefined, так как ваш пример его хорошо иллюстрирует.

Если единственным инструментом, предоставляемым g++, является -Wconversion, возможно, вы должны сделать свой собственный инструмент для фильтрации предупреждений для вашего удобства (я имею в виду обычные sed, awk, perl или php, но это зависит от доступности из этих инструментов в вашей системе, и, возможно, вы можете сделать что-то подобное непосредственно из вашей среды IDE, если вы его используете).

Вы также можете использовать конкретные директивы pragma gcc, чтобы ограничить проверку переходов на определенные файлы или даже определенные части кода.

Любой другой программный метод, используемый для точного определения вашего кода, в котором возникают проблемные преобразования, безусловно, может быть использован для вставки явных приемов, что является целью, к которой вы должны стремиться.

Ответ 2

Я знаю, что вы сказали, что не хотите использовать -Wconversion, но он предупреждает о проблеме, о которой вы заботитесь, и по крайней мере в g++ 4.5 не предупреждает при преобразовании long в unsigned long (например), Для любых других случаев, когда он предупреждает, где вы выполняете законное желаемое преобразование, просто бросьте его. Ваши будущие сопровождающие будут благодарны вам за то, что они явно ясно дали понять, что делается известное преобразование, а не гадать, намеренно или нет оно из контекста кода.