【发布时间】:2012-08-27 12:42:57
【问题描述】:
例如,我怎样才能摆脱源文件中的“warning: unnamed struct/union that defines no instances”,而不是通过编译器命令行选项。
我想定义一个 C 宏 CONST_BUG_ON,用于在编译时检查一些 const 值。
#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__。
感谢巴西尔·斯塔林克维奇
#define CONST_BUG_ON(e) do { \
int tab[__builtin_constant_p(e)?1:-1] = {0}; \
if (tab[0]) abort(); } while (0)
这是一个C语句,只能放在函数中,我很想在函数外使用。
【问题讨论】:
-
发帖人的问题中有一个 GCC 标签
-
为什么这对您如此重要?真正的用例是什么??
标签: c gcc compile-time