Как отключить конкретное предупреждение «бессмысленное сравнение беззнакового с нулем»?

Предположим, у меня есть функция, подобная следующей:

#define LOWER_BOUND 0
#define UPPER_BOUND 42

int is_value_in_range( some_typedef val)
{
    return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
}

Предполагая, что у меня есть предупреждения, настроенные соответствующим образом, если some_typedef оказывается чтобы быть беззнаковым типом, я получу предупреждение о бессмысленном сравнении беззнакового типа с 0. Конечно, это правда, и это имеет смысл.

Однако, допустим, что я действительно хочу проверка наличия нуля в коде по одной или нескольким возможным причинам, например:

  • Хотя границы всегда будут константами времени компиляции, они могут быть чем-то, что может измениться (и макросы могут не «жить» очень близко к функции). Например, границы могут быть установлены путем передачи параметров компилятору.
  • Я мог бы защитить себя от более позднего изменения typedef на подписанный тип, поскольку возможно, что каждое без исключения использование typedef не может быть тщательно изучен при его изменении.

Есть ли приличный, достаточно переносимый способ отключить предупреждение? h ere, не выключив его полностью?

Что-то, что полагается на функциональность, подобную 'STATIC_ASSERT ()' (которая доступна мне), было бы приемлемо, если это разумно. Я согласен нарушить компиляцию, если тип изменится, чтобы заставить кого-то взглянуть на код. Но, возможно, важно отметить, что typeof - это не то, что у меня есть во всех компиляторах, на которые я нацелен.

Я специально ищу решения для языка C, поэтому шаблонов нет использовать здесь ...

8
задан Shweta 7 June 2011 в 10:54
поделиться