linux kernel.h文件中定义的宏

时间:2014-09-22 11:15:11

标签: c++ c linux macros

在堆栈溢出时,我遇到了一个问题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上失败

1 个答案:

答案 0 :(得分:4)

仔细阅读best answer

  

这个宏有些名不副实;它应该是更像的东西   BUILD_BUG_OR_ZERO,而不是...ON_ZERO

因此,当参数非零时,它无法编译:

int main()
{
    BUILD_BUG_ON_ZERO(1);
    return 0;
}

http://ideone.com/TI97r3


至于实际用途:

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代替。