一起来认识Linux中的 BUILD_BUG_ON 宏

简介: 一起来认识Linux中的 BUILD_BUG_ON 宏

该宏在Linux内核中实现的,可以在编译的时候检查传入参数的合法性,而assert是在运行到断言的时候才会知道参数的合法性。

原型
include/linux/kernel.h
/ Force a compilation error if condition is true /

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

/ Force a compilation error if condition is true, but also produce a
result (of value 0 and type size_t), so the expression can be used
e.g. in a structure initializer (or where-ever else comma expressions
aren't permitted).
/

define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)

表达式sizeof(char[1 - 2!!(condition)])的作用,首先对条件表达式进行两次取反,这可以保证执行 1 - 2!!(condition) 的结果只有两种值:条件为0时结果为1或者不为0则结果为-1,显然char[-1]将会导致编译器报错。注意:两次取反的目的是为了将表达式的值转换为逻辑值。
BUILD_BUG_ON:只有条件condition为0时可编译,但不返回值,否则编译器报错。
BUILD_BUG_ON_ZERO:只有条件e为0时返回0,否则编译器报错。

当我们调试完代码后,建议关闭这个宏,可以使用另一个宏定义来使能/关闭BUILD_BUG_ON 宏。

相关文章
|
7月前
|
Linux
Linux container_of宏详细剖析
Linux container_of宏详细剖析
65 0
Linux container_of宏详细剖析
|
11月前
|
存储 Linux C语言
Linux 内核常见的宏(1):offsetof 和 container_of分析
Linux 内核常见的宏(1):offsetof 和 container_of分析
156 0
Linux 内核常见的宏(1):offsetof 和 container_of分析
|
Linux C语言
介绍几种LINUX编程中非常实用的调试程序宏变量
介绍几种LINUX编程中非常实用的调试程序宏变量
|
Linux 容器
Linux内核中的常用宏container_of
/* linux-2.6.38.8/include/linux/compiler-gcc4.h */ #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) /* linux-2.
911 0
|
缓存 Linux
Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域:     bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。
1045 0
|
缓存 Linux C++
linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
一、_IO, _IOR, _IOW, _IOWR 宏的用法与解析 在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。
2479 0
|
缓存 Linux
linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域:     bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。
1058 0
|
Linux
linux定义的几个实用宏案例测试-得闲研究
得闲研究下面几个宏!! #define offsetof(type,memb) (ssize_t)&(((type *)0)->memb); #define msleep(i) usleep((i)*1000) #define die(s) do {perro...
685 0