Моя _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);
}