我的一些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])

10-08 08:55