c - 在代码中沉默 -Wtype-limits 和 -Wbool-compare,没有 pragma

标签 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
  ^~~~

是否可以在没有编译指示的情况下从代码中消除这些警告?

最佳答案

我的基于_GenericX>=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;

感谢Christian Gibbons征求意见。

后来我发现我实际上想要宏扩展为一个整数常量表达式(可用于_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);

}

关于c - 在代码中沉默 -Wtype-limits 和 -Wbool-compare,没有 pragma,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820137/

相关文章:

c - 在c中打开并写入文本

c - 错误 : expected ')' before '*' token

c - 外部函数原型(prototype)和静态定义

c - 在 Netbeans 中在哪里设置 GCC 库依赖项?

c++ - 在类模板上使用 arm gcc 编译期间出现段错误

c++ - 使用 cmake 实用程序编译时出错

c - 该函数的时间复杂度/包括字符串数组

c - 通过 C 指针访问 Linux 键盘

c++ - VTK:高度场的基本可视化

c++ - 共享库与接口(interface)中的 STL 对象的 GCC 兼容性