C语言函数名替换

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

        大概是这个意思。下面记录了下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  
  
void ili9225_lcdStartScroll();  // 假设这是你的函数声明  
  
void (*StartScroll)() = ili9225_lcdStartScroll;  // 创建一个指向函数的指针,并将其初始化为你的函数  
  
int main() {  
    StartScroll();  // 通过指针调用你的函数  
    return 0;  
}

在这个例子中,StartScroll 是一个函数指针,它指向 ili9225_lcdStartScroll 函数。你可以像这样通过 StartScroll 调用 ili9225_lcdStartScroll 函数。

三、总结

1、通过宏替换函数名

2、通过函数指针替换函数

你可能感兴趣的:(c语言,开发语言)