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

Posted 字节卷动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的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 使用#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)

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

关键是要在每一个换行的时候加上一个\\,用dowhile(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.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.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.5 其他实现

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

参考链接

以上是关于我的C/C++语言学习进阶之旅C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块的主要内容,如果未能解决你的问题,请参考以下文章

我的C/C++语言学习进阶之旅C++编程常出现错误:Undefined Reference的一些常见情况分析

我的C/C++语言学习进阶之旅C++编程常出现错误:Undefined Reference的一些常见情况分析

我的C/C++语言学习进阶之旅收集关于MODERN C++ 11/14/17/20/23 的一些资料

我的C/C++语言学习进阶之旅收集关于MODERN C++ 11/14/17/20/23 的一些资料

我的C/C++语言学习进阶之旅C++格式化字符串

我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类