每个结构调用使用一次的结构函数指针
发布时间:2020-12-16 07:03:49 所属栏目:百科 来源:网络整理
导读:我有一个包含几个函数指针的结构.通用接口在头文件中生成. 头文件 typedef struct{ void (*Start)(void); void (*ByteWrite)(uint8_t *pBuffer); // Modifies I2C buffer uint8_t (*ByteRead)(uint8_t *pBuffer); void (*ArrayWrite)(uint8_t *pBuffer); uin
我有一个包含几个函数指针的结构.通用接口在头文件中生成.
头文件 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.Start(); 你写: I2C0.Start(&I2C0); 然后,您可以向结构添加一些额外字段以标识它是哪一个(例如,如果每个I2C总线都有固定的硬件地址,则可能在结构的额外字段中具有硬件地址). 这是执行C类等效的常规C方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |