Предположим, у меня есть функция, подобная следующей:
#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 может не подвергаться тщательному анализу при его изменении.
Есть ли приличный, достаточно портативный способ заставить замолчать предупреждение, не выключая его полностью?
То, что зависит от функции, подобной 'STATIC_ASSERT ()' (доступно для меня), будет приемлемым, если это разумно. Я в порядке с нарушением компиляции, если тип меняется, чтобы заставить кого-то взглянуть на код. Но может быть важно отметить, что typeof
- это не то, что у меня есть во всех компиляторах, на которые я ориентируюсь.
Я специально ищу решения на языке C, поэтому шаблоны здесь бесполезны ...