首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何关闭C源代码中的指定警告?

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

Stack Overflow用户
提问于 2012-08-27 20:42:57
回答 4查看 865关注 0票数 2

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

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

代码语言:javascript
运行
复制
#define CONST_BUG_ON(e)        struct  {int a:!(e);}

它会给出警告warning: unnamed struct/union that defines no instances,但在本例中这不是一个真正的问题。

谢谢汤姆·坦纳

代码语言:javascript
运行
复制
#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抱怨重定义错误。使用__LINE____COUNTER__实例可能会很完美,但我的旧编译器不支持__COUNTER__

谢谢Basile Starynkevitch

代码语言:javascript
运行
复制
#define CONST_BUG_ON(e) do { \
   int tab[__builtin_constant_p(e)?1:-1] = {0}; \
   if (tab[0]) abort(); } while (0)

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

EN

回答 4

Stack Overflow用户

发布于 2012-08-27 21:11:31

解决编译器抱怨的一种方法是,你有一个未命名的结构,没有定义任何实例,就是给它一个名字:

代码语言:javascript
运行
复制
#define CONST_BUG_ON(e)        struct ForDebuggingOnly {int a:!(e);}

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

代码语言:javascript
运行
复制
#define CONST_BUG_ON(e)    extern int ForDebuggingOnly[(e) ? -1 : 1]
票数 3
EN

Stack Overflow用户

发布于 2012-08-27 20:47:07

假设您最近使用的是一个GCC编译器,您可以使用__builtin_constant_p测试编译时常量,可能使用

代码语言:javascript
运行
复制
  #define CONST_BUG_ON(e) do { \
       int tab[__builtin_constant_p(e)?1:-1] = {0}; \
       if (tab[0]) abort(); } while (0)

对于你关于忽略一些警告的问题,也许GCC diagnostic pragmas可以帮助你。

如果您希望CONST_BUG_ON仅在声明上下文中工作,您可以尝试

代码语言:javascript
运行
复制
  #define CONST_BUG_ON(e) CONST_BUG_AT(e,__LINE__)
  #define CONST_BUG_AT(e,l) \
     extern int tab_##l[__builtin_constant_p(e)?0:-1];

最后,您甚至可以使用MELT (一种扩展GCC的高级领域特定语言)定制您的GCC编译器(使用特定于您的编译指示),但这将花费您数天的工作时间。

票数 1
EN

Stack Overflow用户

发布于 2012-08-27 21:17:51

您可以使用宏魔术,通过传入行号来为自己提供一个惟一的ID

代码语言:javascript
运行
复制
#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__)

这是相当棘手的,但它确实在每次使用时都会给出一个唯一的名称(第二级间接可能是虚假的,但这是我在一些经得起时间考验的代码中所拥有的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12142208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档