C语言函数名替换

2023-12-27 17:52:06

? ? ? ? 最近看了几个屏幕驱动的库。因为要处理多个显示驱动,所以同样功能的函数需要对应不同的显示驱动函数,同样的函数需要写多个,但函数名不同。而调用者只需要调用一个统一的函数定义名,通过函数名替换就可以调用不同显示驱动函数。

? ? ? ? 大概是这个意思。下面记录了下2种函数名替换方法。

一、aithinker_Ai-M6X_SDK的处理方法

#define _LCD_FUNC_DEFINE(_func, ...) ai_st7796_spi_##_func(__VA_ARGS__)

  1. #define: 这是C语言中用于定义宏的关键字。

  2. _LCD_FUNC_DEFINE: 这是宏的名字。

  3. _func: 这是宏的一个参数。当你在代码中使用这个宏时,你可以为这个参数提供一个名字,如myFunction

  4. ...: 这是C99标准引入的变长参数宏的表示。这意味着这个宏可以接受任意数量的参数。

  5. ai_st7796_spi_##_func(VA_ARGS): 这部分是宏的替换体。

    • ai_st7796_spi_##_func: 这部分使用预处理器的##操作符来连接字符串。例如,如果你为_func提供一个参数print,那么这部分在替换时会被替换为ai_st7796_spi_print
    • (VA_ARGS): 这是变长参数宏的表示。当你在代码中使用这个宏并提供一些参数时,这些参数会替换这里的__VA_ARGS__

示例:
假设你在代码中这样使用这个宏:

_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、通过函数指针替换函数

文章来源:https://blog.csdn.net/weixin_44067125/article/details/135247663
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。