Подавить сравнение всегда верным предупреждением для макросов? - PullRequest
2 голосов
/ 25 сентября 2011

Мне интересно, есть ли простой / вменяемый способ заставить gcc перестать выдавать эту ошибку, когда противоположной целью сравнения является макрос. Да, я признаю, что с этим конкретным определением макроса сравнение всегда верно, но оно, очевидно, не распространяется на общий случай:

#define ROMBOT 0x00000000
#define ROMTOP 0x00002000
...
if (addr >= ROMBOT && addr < ROMTOP) {

simulator.c:517:2: error: comparison of unsigned expression >= 0 is always true

Одним из решений было бы что-то с эффектом:

#if ROMBOT == 0
if (addr < ROMTOP) {
#else
if (addr >= ROMBOT && addr < ROMTOP) {
#endif

Но это кажется действительно неуклюжим / требовательным к обслуживанию.

или связанных:

#define CHECK_ROM_BOT(_addr) (... etc)

Но это быстро перерастает во множество ужасных / ненужных макросов.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 25 сентября 2011

Один из возможных способов - использовать две переменные, которые, возможно, могут быть изменены, например:

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, вероятно, разумно.

...