欢迎光临散文网 会员登陆 & 注册

7.一个”标准”宏MAX,输入两个参数并返回较大的一个(经典写法+Linux内核写法)

2023-08-23 10:23 作者:踏星赴梦  | 我要投稿

1.比较两个数大小返回最大值的经典宏写法(注意细节,要加入括号):

这种经典写法也是有问题的:如果传入的参数分别是i++和j++,这个比较大小就会出错,i++和j++在宏展开的时候会出现在多个地方,i和j会自增多次

如:

2.Linux内核的实现方法

在GNU C 语言中,如果知道a和b的类型,可以在宏里面定义一个变量,将a和b分别赋值给变量,然后在进行比较:

如果不知道具体的数据类型,就要使用typeof类转换宏,Linux内核中的例子如下:

一个需要注意的问题,下述代码的作用是什么:

(1)首先&_a == &_b 是对_a和_b取地址进行比较,然后得到一个bool值,在这个宏之中,大概率是false;

(2)然后对这个bool值进行强制类型转换,也就是对这个无意义的变量进行引用操作,消除该变量没有被引用的警告;

(3)给出有用的警告:

①两个地址相比的bool值没有被引用的警告(该警告被(void)object;消除)

②两个地址类型不一样,进行比较时Linux会给出类型不一致警告,该警告作为有用警告

(4)要注意,C语言中地址包含两类信息

①物理地址:变量存放在什么地方(位置信息,或者说内存编号/纯地址)

②地址类型:所指向的数据的类型信息





7.一个”标准”宏MAX,输入两个参数并返回较大的一个(经典写法+Linux内核写法)的评论 (共 条)

分享到微博请遵守国家法律