gpt4 book ai didi

c - 如何关闭C源代码中的指定警告?

转载 作者:行者123 更新时间:2023-12-02 08:46:28 24 4
gpt4 key购买 nike

例如,我如何摆脱源文件中的“warning: unnamed struct/union that defines no instances”,而不是通过编译器命令行选项。

我想定义一个 C 宏 CONST_BUG_ON,我用它来在编译时检查一些常量值。

#define CONST_BUG_ON(e)        struct  {int a:!(e);}

它给出了警告 warning: unnamed struct/union that defines no instances,但在这种情况下这不是真正的问题。

谢谢汤姆坦纳

#define CONST_BUG_ON_3(e, l) struct buggy##l {int a:!(e);}
#define CONST_BUG_ON_2(e, l) CONST_BUG_ON_3(e, l)
#define CONST_BUG_ON(e) CONST_BUG_ON_2(e, __LINE__)

很好,但仍然存在一些问题:如果文件 a 的第 6 行包含 CONST_BUG_ON(e),并且文件 a 被文件 b 包含,并且文件 b 的第 6 行还包含 CONST_BUG_ON(e),然后 gcc 提示重新定义错误。使用 __COUNTER__ 代替 __LINE__ 可能会完美,但我的旧编译器不支持 __COUNTER__

谢谢 Basile Starynkevitch

#define CONST_BUG_ON(e) do { \
int tab[__builtin_constant_p(e)?1:-1] = {0}; \
if (tab[0]) abort(); } while (0)

这是一个C语句,只能放在函数里,我真的想在函数外使用。

最佳答案

解决编译器投诉的一种方法是,如果您有一个未定义任何实例的未命名结构,那就是给它一个名称:

#define CONST_BUG_ON(e)        struct ForDebuggingOnly {int a:!(e);}

获得所需表达式测试的另一种方法是声明(但不定义)一个数组,如果 e 为真,则该数组具有非法大小:

#define CONST_BUG_ON(e)    extern int ForDebuggingOnly[(e) ? -1 : 1]

关于c - 如何关闭C源代码中的指定警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12142208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com