在linux kernel.h文件中定义的宏

在堆栈溢出我遇到了一个问题什么是“: - !!” 在C代码?

> #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;
}

在上面的代码中,它给出了一个错误,即类型名称是不允许的。

编辑:代码编译在Linux上使用GCC但在视觉工作室失败


仔细阅读最佳答案:

这个宏有点错误; 它应该更像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

链接地址: http://www.djcxy.com/p/73569.html

上一篇: macros defined in linux kernel.h file

下一篇: Force function to accept specific definitions only?