这在C中是什么意思?AB->;CD->;函数(参数)

这在C中是什么意思?AB->;CD->;函数(参数),c,C,好的,让我再解释一下。我有一个指向结构ABtypestruct1的指针,在结构内部有一个指向另一个名为CD的struct2类型结构的指针,struct2的定义有一些函数原型,包括Func(param)。如果有人能帮我理解一点,我将非常感激 是的,代码是针对微控制器中的USB主机的,我没有添加代码,因为它可以解决问题,但在这里 电话是: void USBHOST_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost){ ...

好的,让我再解释一下。我有一个指向结构
AB
type
struct1
的指针,在结构内部有一个指向另一个名为
CD
struct2
类型结构的指针,
struct2
的定义有一些函数原型,包括
Func(param)
。如果有人能帮我理解一点,我将非常感激


是的,代码是针对微控制器中的USB主机的,我没有添加代码,因为它可以解决问题,但在这里

电话是:

void USBHOST_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost){
    ...
    if (phost->usr_cb->UserInput() == USBH_USR_RESP_OK){
    ...
    }
    ...
}


typedef struct _Host_TypeDef
{
  HOST_State            gState;       /*  Host State Machine Value */
  HOST_State            gStateBkp;    /* backup of previous State machine value */
  ENUM_State            EnumState;    /* Enumeration state Machine */
  CMD_State             RequestState;       
  USBH_Ctrl_TypeDef     Control;

  USBH_Device_TypeDef   device_prop; 

  USBH_Class_cb_TypeDef               *class_cb;  
  USBH_Usr_cb_TypeDef                 *usr_cb;


} USBH_HOST, *pUSBH_HOST;


typedef struct _USBH_USR_PROP
{
  void (*Init)(void);       /* HostLibInitialized */
  void (*DeInit)(void);       /* HostLibInitialized */  
  void (*DeviceAttached)(void);           /* DeviceAttached */
  void (*ResetDevice)(void);
  void (*DeviceDisconnected)(void); 
  void (*OverCurrentDetected)(void);  
  void (*DeviceSpeedDetected)(uint8_t DeviceSpeed);          /* DeviceSpeed */
  void (*DeviceDescAvailable)(void *);    /* DeviceDescriptor is available */
  void (*DeviceAddressAssigned)(void);  /* Address is assigned to USB Device */
  void (*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef *,
                                     USBH_InterfaceDesc_TypeDef *,
                                     USBH_EpDesc_TypeDef *); 
  /* Configuration Descriptor available */
  void (*ManufacturerString)(void *);     /* ManufacturerString*/
  void (*ProductString)(void *);          /* ProductString*/
  void (*SerialNumString)(void *);        /* SerialNubString*/
  void (*EnumerationDone)(void);           /* Enumeration finished */
  USBH_USR_Status (*UserInput)(void);
  int  (*UserApplication) (void);
  void (*DeviceNotSupported)(void); /* Device is not supported*/
  void (*UnrecoveredError)(void);

}
USBH_Usr_cb_TypeDef;

现在我理解了它的功能,但是我找不到UserInput(void)的定义,我找不到它的功能。

它使用这些参数调用结构
struct2
的函数
Func()

函数
Func()
是指向函数的指针,是组成函数的指令启动的指针(内存地址)

有关解释,请参阅


指针是一个变量,必须在用于调用之前进行设置。

它使用这些参数调用结构
struct2
的函数
Func()

函数
Func()
是指向函数的指针,是组成函数的指令启动的指针(内存地址)

有关解释,请参阅

指针是一个变量,必须在用于调用之前进行设置。

您所称的“函数的一些原型,包括
Func(param)
”是一个变量。您可以调用指针指向的函数,就像指针表示该函数的名称一样。最内部的结构已设置为指向某个函数的指针;您的代码段通过其指针调用该函数

下面是一个简短的示例,说明了这是如何工作的():

#包括
类型定义结构{
无效(*func)(int);
}与_fp;
无效测试(int n){
printf(“测试%d\n”,n);
}
内部主(空){
与_fp s={.func=test};
使用_fp*ptr=&s;
ptr->func(123);
返回0;
}
您所说的“函数的一些原型,包括
Func(param)
”是一个很好的例子。您可以调用指针指向的函数,就像指针表示该函数的名称一样。最内部的结构已设置为指向某个函数的指针;您的代码段通过其指针调用该函数

下面是一个简短的示例,说明了这是如何工作的():

#包括
类型定义结构{
无效(*func)(int);
}与_fp;
无效测试(int n){
printf(“测试%d\n”,n);
}
内部主(空){
与_fp s={.func=test};
使用_fp*ptr=&s;
ptr->func(123);
返回0;
}

这有帮助吗?显示你所关心的代码,不要试图用散文来描述它。我认为这个问题不应该被封闭得过于本地化:通过在一个代码<结构> <代码>中嵌入的函数指针调用函数的语法真的很混乱,尤其是如果你熟悉C++的话。这有帮助吗?显示你有问题的代码,不要试图用散文来描述它。我认为这个问题不应该被封闭得过于本地化:通过在一个代码<结构> <代码>中嵌入的函数指针调用函数的语法真的很混乱,尤其是如果你熟悉C++的“成员函数”。这标签是“C”,我知道。它类似于“成员变量”,虽然不是从C++中知道的成员函数,但是它使他更容易理解这个概念。@关于H2CO3的关于C++的其他问题都被标记为“C”。@ H2CO3如果C++问题被标记为C,则编辑并重新标记,不要把它当作是关于C。在这种情况下,我们不清楚问题是什么,因为我们没有看到代码。@ N.M从问题的文本中,不能决定它是关于C还是C++的——两种语言对于两个不同的任务都有相同的语法。所以我假设这个问题没有被误解,这就是为什么我认为“成员函数”这个术语是不准确的。“成员函数”?这标签是“C”,我知道。它类似于“成员变量”,虽然不是从C++中知道的成员函数,但是它使他更容易理解这个概念。@关于H2CO3的关于C++的其他问题都被标记为“C”。@ H2CO3如果C++问题被标记为C,则编辑并重新标记,不要把它当作是关于C。在这种情况下,我们不清楚问题是什么,因为我们没有看到代码。@ N.M从问题的文本中,不能决定它是关于C还是C++的——两种语言对于两个不同的任务都有相同的语法。所以我假设这个问题没有错,这就是为什么我认为“成员函数”这个术语不准确。有没有理由对这个答案投反对票?有没有理由对这个答案投反对票?
#include <stdio.h>

typedef struct {
    void (*func)(int);  
} with_fp;

void test(int n) {
    printf("Test %d\n", n);
}

int main(void) {
    with_fp s = {.func = test};
    with_fp *ptr = &s;
    ptr->func(123);
    return 0;
}