我有一个包含多个函数指针的结构体。通用接口在头文件中定义。
头文件
typedef struct
{
void (*Start)(void);
void (*ByteWrite)(uint8_t *pBuffer); // Modifies I2C buffer
uint8_t (*ByteRead)(uint8_t *pBuffer);
void (*ArrayWrite)(uint8_t *pBuffer);
uint8_t (*ArrayRead)(uint8_t *pBuffer);
bool (*Busy)(void);
} sI2C_t;
extern const sI2C_t I2C0;
extern const sI2C_t I2C1;
extern const sI2C_t I2C2;
然后在C文件中,每个函数指针都实现以满足结构接口。
C文件
static void I2C0_Start(void) { ... }
static void I2C0_ByteWrite(*uint8_t) { ... }
static uint8_t I2C0_ByteRead(*uint8_t) { ... }
static void I2C0_ArrayWrite(*uint8_t) { ... }
static uint8_t I2C_ArrayRead(*uint8_t) { ... }
static bool I2C_Busy(void) { ... }
const sI2C I2C0 =
{
I2C0_Start,
I2C0_ByteWrite,
I2C0_ByteRead,
I2C0_ArrayWrite,
I2C0_ArrayRead,
I2C0_Busy
};
// Code-block repeated for I2C1, I2C2, etc. (REDUNDANT!)
这使得访问特定于I2C接口的函数相对容易:
bool status;
I2C0.Start();
status = I2C1.Busy();
...
虽然 I2C0、I2C1 和 I2C2 等函数指针基本相同,但我必须为每个新的结构接口单独编写出它们。既然这是冗余的,那么有没有办法只实现这些函数指针一次呢?
I2C0
,I2C1
等作为变量名,那么使用数组可能会是更好的整体方法? - Oliver Charlesworthextern const sI2C_t I2C[MAX_NUM];
?每个函数仍然必须为其定义,对吗?您能举个例子说明我如何使用宏吗? - Biff*uint8_t
?你确定可以在参数列表中解引用一个类型名吗? - autistic