Учитывая некоторый код, например:
unsigned short val;
//<some unimportant code that sets val>
if(val>65535) val=65535;
Как мы можем отключить предупреждение «сравнение всегда ложно из-за ограниченного диапазона типов данных» от gcc?
Это использует GCC 4.1.2 и поэтому не имеет конструкции #pragma GCC diagnostics
. Я также не могу найти параметр -W, чтобы отключить его.
Я попытался сделать бросок val:
if(((long)val)>65535); val=65535
Но кажется, что GCC достаточно умен, чтобы выдать предупреждение.
Флаги компилятора -Wall, и это все. Нет — Wextra.
Я действительно не хочу убирать галочку - на этой цели short может быть 16-битным, но это не значит, что так и должно быть. Я счастлив выписать чек по-другому, хотя.
Я хочу включить -Werror, поэтому это предупреждение должно исчезнуть.
EDIT 1 Неважный код не так уж и не важен:
unsigned short val;
float dbValue; (actually function parameter)
val= ((unsigned short) dbValue) & 0xffff);
if(val>65535) val=65535;
Таким образом, если размер коротких изменений изменится, мы получим переполнение, и в любом случае проверка диапазона становится все равно бессмысленной и может быть удалена или более того, чтобы вместо этого применить точку к значению с плавающей запятой.
EDIT 2 Хотя ответы до сих пор помогли улучшить код, все же было бы полезно узнать, есть ли какие-либо средства для отключения этого предупреждения в gcc 4.1.2 - вот в чем был вопрос.
Кажется, это можно сделать в последних выпусках, используя -Wno-type-limits
unsigned
переполнение определено как дополнение до 2 в C. Именноsigned
запускает UB. - person EOF   schedule 20.11.2014val
иметь значения выше 65535 перед входом в условие? Если это возможно, тоunsigned short
не подходит для типа. В противном случае у вас будет разное поведение на 16-битном (переход) и 32-битном (ограничения)short
. - person user694733   schedule 20.11.2014dbValue && 0xffff
не гарантирует, что результат будет ‹= 65535, независимо от размера? - person   schedule 20.11.2014if(val >= 65535) val = 65535;
заставит компилятор замолчать. - person joop   schedule 20.11.2014