Заглушить -Wtype-limit и -Wbool-сравнить в коде, без прагм - PullRequest
0 голосов
/ 15 октября 2018

При компиляции с gcc -Wall -Wextra следующий код

boolcmp.c:

#include <stdio.h>
int main(void)
{
    #define TEST(X) do{if((X)>=0) puts("no minus");}while(0)
    TEST(1);
    unsigned u = 0; (void)u; 
    _Bool b = 0; (void)b;
    TEST(u); //-Wtype-limits
    TEST(b); //-Wbool-compare

}

генерирует -Wtype-limits-Wextra) и -Wbool-comapare-Wall) предупреждения, как отмечено.

boolcmp.c: In function ‘main’:
boolcmp.c:4:27: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
  #define TEST(X) do{if((X)>=0) puts("positive");}while(0)
                           ^
boolcmp.c:8:2: note: in expansion of macro ‘TEST’
  TEST(u); //-Wtype-limits
  ^~~~
boolcmp.c:4:27: warning: comparison of constant ‘0’ with boolean expression is always true [-Wbool-compare]
  #define TEST(X) do{if((X)>=0) puts("positive");}while(0)
                           ^
boolcmp.c:9:2: note: in expansion of macro ‘TEST’
  TEST(b); //-Wbool-compare
  ^~~~

Могут ли эти предупреждения быть отключены из кода без прагм?

1 Ответ

0 голосов
/ 15 октября 2018

Моя _Generic замена без жалоб для X>=0 теста:

#define MY_nominus_eh(X)  \
_Generic((X)+0LL,llong:my_spos_,ullong:my_upos_,default:my_fpos_)(X)
static inline _Bool my_upos_(ullong X) { (void)X; return 1; }
static inline _Bool my_spos_(llong X) { return X>=0; }
static inline _Bool my_fpos_(ldouble X) { return X>=0; }
//assumes: typedef long long llong; 
//typedef unsigned long long ullong;
//typedef long double ldouble;

Благодарю Кристиана Гиббона за предложение.

ПозжеЯ обнаружил, что на самом деле хотел, чтобы макрос расширился до целочисленного константного выражения (можно использовать в _Static_assert), поэтому мне пришлось придумать что-то другое.

Уловка, которую я использовалдолжен был использовать _Generic, чтобы заменить подозрительно типизированную переменную целочисленной константой, которая, хотя и приводила к тавтологическому сравнению, не вызвала предупреждение gcc.

#include <stdio.h>
int main(void)
{
    #define TEST(X) do{if( _Generic((X),_Bool:0,default:_Generic(+(X),unsigned:0,\
                    unsigned long:0,unsigned long long:0,default:X)) >=0) puts("no minus"); else puts("minus"); }while(0)
    TEST(1);
    unsigned u = 0; (void)u; 
    _Bool b = 0; (void)b;
    TEST(u); //-Wtype-limits
    TEST(b); //-Wbool-compare
    TEST(-1);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...