当前位置 博文首页 > dadalaohua的博客:【C语言笔记】【宏定义系列】 返回一个限定在

    dadalaohua的博客:【C语言笔记】【宏定义系列】 返回一个限定在

    作者:[db:作者] 时间:2021-07-11 10:09

    【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;
    }
    

    实现过程

    1. typeof(val) __val = (val)
      typeof(min) __min = (min)
      typeof(max) __max = (max)

      使用一个与参数相同数据类型的临时变量来保存参数的值,避免类似自增或自减带来的影响。

    2. (void) (&__val == &__min)
      (void) (&__val == &__max)

      这个用于检测这个宏里的两个参数的数据类型是否相同,如果不相同,则编译器就会出现警告提示。

    3. __val = __val < __min ? __min: __val;__val > __max ? __max: __val

      先比较当前值是否小于给定范围的最小值,如果小于最小值则返回最小值;
      然后比较当前值是否大于给定范围的最大值,如果大于最大值则返回最大值;
      如果在给定范围内,就返回当前值。

    [参考资料]

    linux kernel 3.10


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

    cs