linux内核.h文件中定义的宏

macros defined in linux kernel.h file

本文关键字:定义 文件 内核 linux      更新时间:2023-10-16

在堆栈溢出时,我遇到了一个问题什么是":-"在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编译,但在visualstudio上失败

仔细阅读最佳答案:

该宏的名称有些错误;应该更像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