? ? ? ? 最近看了几个屏幕驱动的库。因为要处理多个显示驱动,所以同样功能的函数需要对应不同的显示驱动函数,同样的函数需要写多个,但函数名不同。而调用者只需要调用一个统一的函数定义名,通过函数名替换就可以调用不同显示驱动函数。
? ? ? ? 大概是这个意思。下面记录了下2种函数名替换方法。
#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): 这部分是宏的替换体。
##
操作符来连接字符串。例如,如果你为_func
提供一个参数print
,那么这部分在替换时会被替换为ai_st7796_spi_print
。__VA_ARGS__
。示例:
假设你在代码中这样使用这个宏:
_LCD_FUNC_DEFINE(print, "Hello, World!");
预处理器会将其替换为:
ai_st7796_spi_print("Hello, World!");
简而言之,这个宏允许你为ai_st7796_spi
系列函数提供一个函数名作为前缀,并为其提供任意数量的参数
在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、通过函数指针替换函数