Один из возможных способов - использовать две переменные, которые, возможно, могут быть изменены, например:
uintptr_t rombot = ROMBOT;
uintptr_t romtop = ROMTOP;
if (addr >= rombot && addr < romtop)
Если эти переменные видны за пределами текущего исходного файла, они могут измениться при обстоятельствах, которые компилятор не можетсм. компиляцию этого файла, поэтому он не может законно предупредить о сравнении.
#include <stdint.h>
#define ROMBOT 0x00000000
#define ROMTOP 0x00002000
uintptr_t rombot = ROMBOT;
uintptr_t romtop = ROMTOP;
extern int check_addr(uintptr_t addr);
int check_addr(uintptr_t addr)
{
if (addr >= ROMBOT && addr < ROMTOP)
return 1;
if (addr >= rombot && addr < romtop)
return 2;
return 0;
}
$ make xx.o
/usr/bin/gcc -g -std=c99 -Wall -Wextra -c -o xx.o xx.c
xx.c: In function ‘check_addr’:
xx.c:13: warning: comparison of unsigned expression >= 0 is always true
$
Предупреждение (поскольку я не компилировал с -Werror
) появляется для вашего исходного кода, а не для предлагаемого кода замены,Вам нужно подумать о типах переменных, но uintptr_t
, вероятно, разумно.