当前位置 博文首页 > dadalaohua的博客:【C语言笔记】【宏定义系列】 返回一个限定在
宏定义系列内容。用于记录各式各样有用或者没用的宏定义?。
用于返回一个限定在给定范围内的值。例如给定范围10到20之间,如果当前值为15时,处于范围10到20之间,返回15;当前值为5时,不在范围10到20之间,小于10,所以返回10;当前值为25时,不在范围10到20之间,大于20,所以返回20。
这个宏会进行严格的类型检查。
该宏定义来自linux kernel 3.10。
#define clamp(val, min, max) ({ \
typeof(val) __val = (val); \
typeof(min) __min = (min); \
typeof(max) __max = (max); \
(void) (&__val == &__min); \
(void) (&__val == &__max); \
__val = __val < __min ? __min: __val; \
__val > __max ? __max: __val; })
宏定义中:
val表示当前值。
min表示最小允许值 。
max表示最大允许值 。
示例程序用于返回一个限定在给定范围40到50之间的值。当val为45时,处于范围40到50之间,返回45;当val为35时,不在范围40到50之间,小于40,所以返回40;当val为55时,不在范围40到50之间,大于50,所以返回50。
int main(int argc, char* argv[])
{
int val, min, max;
val = 45;
min = 40;
max = 50;
printf("val : %d\n", clamp(val, min, max));
val = 35;
printf("val : %d\n", clamp(val, min, max));
val = 55;
printf("val : %d\n", clamp(val, min, max));
return 0;
}
typeof(val) __val = (val)
typeof(min) __min = (min)
typeof(max) __max = (max)
使用一个与参数相同数据类型的临时变量来保存参数的值,避免类似自增或自减带来的影响。
(void) (&__val == &__min)
(void) (&__val == &__max)
这个用于检测这个宏里的两个参数的数据类型是否相同,如果不相同,则编译器就会出现警告提示。
__val = __val < __min ? __min: __val;__val > __max ? __max: __val
先比较当前值是否小于给定范围的最小值,如果小于最小值则返回最小值;
然后比较当前值是否大于给定范围的最大值,如果大于最大值则返回最大值;
如果在给定范围内,就返回当前值。
linux kernel 3.10
本文链接:https://blog.csdn.net/u012028275/article/details/118061341
cs