最近看了几个屏幕驱动的库。因为要处理多个显示驱动,所以同样功能的函数需要对应不同的显示驱动函数,同样的函数需要写多个,但函数名不同。而调用者只需要调用一个统一的函数定义名,通过函数名替换就可以调用不同显示驱动函数。
大概是这个意思。下面记录了下2种函数名替换方法。
一、aithinker_Ai-M6X_SDK的处理方法
#define _LCD_FUNC_DEFINE(_func, ...) ai_st7796_spi_##_func(__VA_ARGS__)
-
#define: 这是C语言中用于定义宏的关键字。
-
_LCD_FUNC_DEFINE: 这是宏的名字。
-
_func: 这是宏的一个参数。当你在代码中使用这个宏时,你可以为这个参数提供一个名字,如
myFunction
。 -
...: 这是C99标准引入的变长参数宏的表示。这意味着这个宏可以接受任意数量的参数。
-
ai_st7796_spi_##_func(VA_ARGS): 这部分是宏的替换体。
- ai_st7796_spi_##_func: 这部分使用预处理器的
##
操作符来连接字符串。例如,如果你为_func
提供一个参数print
,那么这部分在替换时会被替换为ai_st7796_spi_print
。 - (VA_ARGS): 这是变长参数宏的表示。当你在代码中使用这个宏并提供一些参数时,这些参数会替换这里的
__VA_ARGS__
。
- ai_st7796_spi_##_func: 这部分使用预处理器的
示例:
假设你在代码中这样使用这个宏:
_LCD_FUNC_DEFINE(print, "Hello, World!");
预处理器会将其替换为:
ai_st7796_spi_print("Hello, World!");
简而言之,这个宏允许你为ai_st7796_spi
系列函数提供一个函数名作为前缀,并为其提供任意数量的参数
二、esp-idf-parallel-tft的处理方法
在C语言中,您不能直接像这样将一个变量的值赋给一个函数名,因为函数名本质上是一个指向函数的指针。但是,你可以通过指针来实现类似的效果。
如果你想让函数名 StartScroll
指向 ili9225_lcdStartScroll
,你需要声明一个函数指针,如下所示:
#include <stdio.h>
void ili9225_lcdStartScroll(); // 假设这是你的函数声明
void (*StartScroll)() = ili9225_lcdStartScroll; // 创建一个指向函数的指针,并将其初始化为你的函数
int main() {
StartScroll(); // 通过指针调用你的函数
return 0;
}
在这个例子中,StartScroll
是一个函数指针,它指向 ili9225_lcdStartScroll
函数。你可以像这样通过 StartScroll
调用 ili9225_lcdStartScroll
函数。
三、总结
1、通过宏替换函数名
2、通过函数指针替换函数