gpt4 book ai didi

c - 指向结构的函数指针在每个结构调用中使用一次

转载 作者:太空狗 更新时间:2023-10-29 15:41:01 24 4
gpt4 key购买 nike

我有一个包含多个函数指针的结构。通用接口(interface)在头文件中制作。

头文件

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 文件中实现每个函数指针以满足结构接口(interface)。

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 接口(interface)的功能变得相对容易:

bool status;

I2C0.Start();
status = I2C1.Busy();
...

虽然函数指针对于 I2C0、I2C1 和 I2C2 等基本相同,但我必须为每个新结构接口(interface)单独写出它们中的每一个。由于这是多余的,有没有办法让我只实现一次这些函数指针?

最佳答案

标准解决方案是将结构指针作为第一个参数传递给函数。 IE。而不是:

I2C0.Start();

你写:

I2C0.Start(&I2C0);

然后您可以向该结构添加一些额外的字段以识别它是哪一个(例如,如果您为每条 I2C 总线设置了固定的硬件地址,您可能会在该结构的额外字段中拥有硬件地址)。

这是执行与 C++ 类等效的普通 C 方法。

关于c - 指向结构的函数指针在每个结构调用中使用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com