在堆栈溢出时,我遇到了一个问题What is ":-!!" in C code?
> #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
> #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
出于好奇,我想知道如何使用这些宏?
int main()
{
BUILD_BUG_ON_ZERO(0);
return 0;
}
在上面的代码中,它给出了一个错误,即不允许使用类型名称。
编辑: 代码使用gcc在linux上编译,但在visual studio上失败
答案 0 :(得分:4)
仔细阅读best answer:
这个宏有些名不副实;它应该是更像的东西
BUILD_BUG_OR_ZERO
,而不是...ON_ZERO
因此,当参数非零时,它无法编译:
int main()
{
BUILD_BUG_ON_ZERO(1);
return 0;
}
至于实际用途:
int main()
{
BUILD_BUG_ON_ZERO(sizeof(int) != 4); // we need int to be 4 bytes, stop compilation otherwise
return 0;
}
对于C ++:这是一个C编译器,根本不能用C ++编译。
在C ++ 11中,您可以使用static_assert
代替。