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

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

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

宏定义说明

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

这个宏定义没有返回值,如果需要返回值可以使用 BUILD_BUG_ON_ZERO.

该宏定义来自linux kernel 3.10。

实现代码

#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

宏定义中:

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

示例程序

条件为假时程序可以编译通过。

int main(int argc, char* argv[])
{
    BUILD_BUG_ON(0);
    return 0;
}

将条件更改为真:

int main(int argc, char* argv[])
{
    BUILD_BUG_ON(1);
    return 0;
}

则编译失败,提示

error: size of unnamed array is negative
错误: 无名数组的大小为负

最后看一下条件为假时,对程序进行预处理得到展开后的宏:

int main(int argc, char* argv[])
{
    ((void)sizeof(char[1 - 2*!!(0)]));

    return 0;
}

实现过程

  1. !!(condition)

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

  2. char[1 - 2*!!(condition)]

    如果表达式condition的结果为 0,则得到数组 char[1],这是一个大小为1的无名数组。

    如果表达式condition的结果为 1,则得到数组 char[-1],则编译错误。由于数组的大小不能是负的,所以编译错误,提示错误 error: size of unnamed array is negative,无名数组的大小为负。

  3. ((void)sizeof(char[1 - 2*!!(condition)]))

    如果表达式condition的结果为 0,则使用 sizeof 运算符计算得到这个无名数组char[1]的大小为 1,但由于有(void)的存在,这个宏是没有返回值的。

    如果没有(void)的存在,示例程序就会提示如下警告:

    warning: statement with no effect [-Wunused-value]
    警告: 语句不起作用 [-Wunused-value]
    

    所以(void)使得该宏定义既没有返回值又消除了未使用的警告。

[参考资料]

linux kernel 3.10

/include/linux/bug.h


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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值