我的一些C宏需要扩展为整数常量表达式,
根据以下内容在其中包含编译时声明:
#define stc_assert_expr(CexprB) sizeof(struct{int _:(CexprB)?1:-1;})
可以将其拼写为
#include <assert.h>
#define stc_assert_expr(CexprB) sizeof(struct{static_assert(CexprB,#CexprB);})
//^not sure if this is legal C but it compiles with gcc and clang
//(I'm using the bitfield version anyway, which is definitely legal C)
伪装示例用法:
#include <assert.h>
#define stc_assert_expr(CexprB) sizeof(struct{int _:(CexprB)?1:-1;})
int main(int argc, char**argv)
{
#define minus1(X) (0*stc_assert_expr((X)>0)+(X)-1) \
/*an integer constant expression with an assertionin it*/
char ar[minus1(3)];
switch(argc){
case minus1(2): ;
}
}
假设我想使这些宏也可以在C ++中使用。
上面的示例不起作用,因为C ++在
sizeof
内不接受结构定义。我可以用C ++构造替换stc_assert_expr(CexprB)
来保留static_assert语义吗? 最佳答案
您可以使用数组表达式而不是结构体定义-两种语言中的负数组大小都是非法的:
#define stc_assert_expr(condition) sizeof(char[(condition) ? 1 : -1])