使-Wtype-limits和-Wbool-compare在代码中静音,没有杂物

时间:2018-10-15 15:33:42

标签: c gcc

使用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 :(得分:2)

我基于_Generic的{​​@ 1}}测试的非抱怨替代品:

X>=0

感谢Christian Gibbons的建议。

后来我发现我实际上希望宏扩展为整数常量表达式(可在#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将可疑类型的变量替换为整数常量,虽然这也会导致重言式比较,但不会触发gcc的警告。

_Generic