【C语言笔记】【宏定义系列】 编译时检查

本文详细介绍了Linux内核中用于编译时检查的BUILD_BUG_ON_ZERO宏定义,该宏在条件为真时会导致编译错误。通过示例程序和展开后的宏代码解释了其实现原理,当条件为0时返回0,否则因位字段宽度为负引发编译错误。该宏常用于确保代码在编译阶段遵循特定约束。
摘要由CSDN通过智能技术生成

【C语言笔记】【linux宏定义系列】 编译时检查

linux宏定义系列内容。用于记录在linux kernel之中各式各样的宏定义☺。

宏定义说明

用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,编译器报错,反之如果条件为假,则编译正常,且有返回值,返回 0。

该宏定义来自linux kernel 3.10。

实现代码

#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))

宏定义中:

e 表示要用于判断的条件表达式。

示例程序

条件为假时程序可以编译通过,且返回值为 0 。

int main(int argc, char* argv[])
{
    printf("%zu\n", BUILD_BUG_ON_ZERO(0));
    return 0;
}

运行后,结果为:

0

将条件更改为真:

int main(int argc, char* argv[])
{
    printf("%zu\n", BUILD_BUG_ON_ZERO(1));
    return 0;
}

则编译失败,提示

error: negative width in bit-field ‘<anonymous>’
错误: 位段‘<匿名>’宽度为负

对程序进行预处理得到展开后的宏:

int main(int argc, char* argv[])
{
    printf("%zu\n", (sizeof(struct { int:-!!(1); })));

    return 0;
}

实现过程

  1. !!(e)

    对条件e进行两次逻辑非运算,得到逻辑值结果 0 或者 1。如果表达式e的结果为 0 ,则得到 0 , 如果为非 0 值,则得到 1 。

  2. struct { int:-!!(e); }

    如果表达式e的结果为 0,则得到结构体 struct { int:0; },这是一个匿名的位域结构体,位域宽度为0。

    如果表达式e的结果为 1,则得到结构体 struct { int:-1; },则编译错误。由于位域的宽度不能是负的,所以编译错误,提示错误 error: negative width in bit-field ‘<anonymous>’

  3. (sizeof(struct { int:-!!(e); }))

    如果表达式e的结果为 0,则使用 sizeof 运算符计算得到这个匿名结构体struct { int:0; }的大小为 0,宏的返回值为 0。

[参考资料]

linux kernel 3.10

/include/linux/bug.h


本文链接:https://blog.csdn.net/u012028275/article/details/127478561

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值