C 结构中包含结构参数的函数指针

C 结构中包含结构参数的函数指针,c,function-pointers,C,Function Pointers,我有一个结构,目前看起来像这样(缩写为仅显示基本部分): typedef结构{ uint32_t波特率; …此处还有一些其他内部使用的值 void(*request_received)(void*hbus);//

我有一个结构,目前看起来像这样(缩写为仅显示基本部分):

typedef结构{
uint32_t波特率;
…此处还有一些其他内部使用的值
void(*request_received)(void*hbus);//<这就是我要说的
}hbus_选项;
这很有效。基本上,它包含一个函数指针,该指针指向void类型的参数

实际上,我希望这更容易理解:

typedef struct {
    uint32_t baudrate;
    ... some other internally used values here
    void (*request_received)(hbus_options_t* hbus); //< this doesn't work
} hbus_options_t;
typedef结构{
uint32_t波特率;
…此处还有一些其他内部使用的值
无效(*已收到请求)(hbus选项hbus);//<这不起作用
}hbus_选项;

显然,编译器需要知道结构才能使用它。这通常是怎么做的?使用空指针是可行的,但更难理解。

这是通过不疏忽并提供结构标记来实现的:

typedef struct hbus_options {
    uint32_t baudrate;
    ... some other internally used values here
    void (*request_received)(struct hbus_options * hbus); 
} hbus_options_t;
除了可读性之外,如果您传递指向预期结构类型以外的对象的指针,编译器也会抱怨


添加一个标签还可以使组件的耦合更加松散。可以向前声明结构,但不能声明类型别名。

回答得很好,谢谢。是的,我必须对void*进行显式强制转换,而另一种方法是阻止编译器抱怨。@TomL.-您必须强制转换为
无效*
?这很奇怪。这是一个隐式转换。或者,您的意思是必须强制转换函数指针?这很危险,我是说函数指针,对不起。是的,这就是我不喜欢它的原因。
typedef struct hbus_options {
    uint32_t baudrate;
    ... some other internally used values here
    void (*request_received)(struct hbus_options * hbus); 
} hbus_options_t;