• 【我的C/C++语言学习进阶之旅】C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块


    一、需求描述

    在项目开发过程中,有很多通用的代码,可以抽取出宏定义来简化代码。

    比如我最近在做一个滤镜的项目时候,很多基本的调色代码都类似,如下所示,就可以抽取通用的代码。

    1.1 原有代码

    在这里插入图片描述

       if(strcmp(buffer, "brightness") == 0)
        {
            float intensity;
            if(sscanf(pstr, "%f", &intensity) != 1)
            {
                LOGE("Invalid Parameters: %s\n", pstr)
                return nullptr;
            }
            auto* bp = new AdjustBrightness();
            bp->setIntensity(intensity);
            proc = bp;
        }
        else if(strcmp(buffer, "contrast") == 0)
        {
            float intensity;
            if(sscanf(pstr, "%f", &intensity) != 1)
            {
                LOGE("Invalid Parameters: %s\n", pstr)
                return nullptr;
            }
            auto* bp = new AdjustContrast();
            bp->setIntensity(intensity);
            proc = bp;
        }
        else if(xxxx){
            xxxx
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    1.2 使用#define定义

    在这里插入图片描述

    #define ADJUSTHELP_COMMON_FUNC(str, procName, setFunc) \
    do{\
    	float intensity;\
    	if(sscanf(str, "%f", &intensity) != 1)\
    	{\
            LOGE("Invalid Parameters: %s\n", str) \
    		return nullptr;\
    	}\
    	procName* bp = new procName();\
        proc = bp;\
        bp->setFunc(intensity);\
    }while(0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第一个参数str 是字符串
    第二个参数procName 是类名
    第三个参数setFunc是方法名

    关键是要在每一个换行的时候加上一个\,用do{}while(0)语句包含多语句防止错误 ,代码就只会执行一次。

    1.3 改造代码

    在这里插入图片描述
    在这里插入图片描述

    if(strcmp(buffer, "brightness") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustBrightness, setIntensity);
        }
        else if(strcmp(buffer, "contrast") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustContrast, setIntensity);
        }
        else if(strcmp(buffer, "exposure") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustExposure, setIntensity);
        }
        else if(strcmp(buffer, "hue") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustHue, setIntensity);
        }
        else if(strcmp(buffer, "saturation") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustSaturation, setIntensity);
        }
        else if(strcmp(buffer, "sharpen") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustSharpenOrBlur, setSharpenIntensity);
        }
        else if(strcmp(buffer, "blur") == 0)
        {
            ADJUSTHELP_COMMON_FUNC(pstr, AdjustSharpenOrBlur, setBlurIntensity);
        }
        else{
            LOGE("Invalid Parameters: %s\n", pstr)
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    这样代码就可以抽取很通用的代码逻辑出去,精简代码。

    1.4 更多示例

    1.4.1 调用两个方法

    比如,我们的代码需要调用两个不同的方法,那么可以参考类似的代码

    在这里插入图片描述

    #define ADJUSTHELP_COMMON_FUNC2(str, procName, setFunc1, setFunc2) \
    do{\
    	float intensity1, intensity2;\
    	if(sscanf(str, "%f%*c%f", &intensity1, &intensity2) != 2)\
    	{\
    		LOG_ERROR_PARAM(str);\
    		return nullptr;\
    	}\
    	procName* bp = new procName();\
    	if(!bp->init())\
    	{\
    		delete bp;\
    	}\
    	else \
    	{\
    		proc = bp;\
    		bp->setFunc1(intensity1);\
    		bp->setFunc2(intensity2);\
    	}\
    }while(0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.4.1 调用三个方法

    在这里插入图片描述

    #define ADJUSTHELP_COMMON_FUNC3(str, procName, setFunc1, setFunc2, setFunc3) \
    do{\
    	float intensity1, intensity2, intensity3;\
    	if(sscanf(str, "%f%*c%f%*c%f", &intensity1, &intensity2, &intensity3) != 3)\
    	{\
    		LOG_ERROR_PARAM(str);\
    		return nullptr;\
    	}\
    	procName* bp = new procName();\
    	if(!bp->init())\
    	{\
    		delete bp;\
    	}\
    	else \
    	{\
    		proc = bp;\
    		bp->setFunc1(intensity1);\
    		bp->setFunc2(intensity2);\
    		bp->setFunc3(intensity3);\
    	}\
    }while(0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.5 其他实现

    C++还可以使用template来实现类似的效果,这里就不写了。

    参考链接

  • 相关阅读:
    HDLBits-Lemmings1
    OceanBase 4.0 all-in-one 版本快速尝鲜安装步骤
    MS90C385B——+3.3V 150MHz 的 24bit 平板显示器(FPD) LVDS 信号发送器
    提升80%上云集成效率, TA是如何做到的
    Flutter:getX的学习
    Vue3+Ts+Vite项目(第十二篇)——echarts安装与使用,vue3项目echarts组件封装
    nodejs安装及环境配置
    数据挖掘与分析应用:数据挖掘解决什么?流程是?Python数据挖掘的三方库,环境依赖准备
    Android11 实现有线网络和wifi共存
    Fabric.js 使用纯色遮挡画布(前景色)
  • 原文地址:https://blog.csdn.net/qq446282412/article/details/126484990