【问题标题】:What does this means in C? AB->CD->Func(param)这在 C 中意味着什么? AB->CD->Func(参数)
【发布时间】:2012-10-26 21:30:33
【问题描述】:

好的,让我再解释一下。我有一个指向结构AB 类型struct1 的指针,在结构内部有一个指向另一个名为CDstruct2 结构的指针,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) 的定义我找不到它的作用。

【问题讨论】:

  • 显示你有疑问的代码,不要试图用散文来描述。
  • 我认为这个问题不应该因为过于本地化而结束:通过嵌入在 struct 中的函数指针调用函数的语法确实令人困惑,尤其是如果您熟悉 C++。

标签: c


【解决方案1】:

您所说的“包括Func(param) 在内的一些函数原型”是function pointer。您可以调用指针指向的函数,就好像指针表示该函数的名称一样。最里面的结构已经设置了一个指向某个函数的指针;您的代码 sn-p 通过其指针调用该函数。

这里有一个简短的例子来说明它是如何工作的 (also on ideone):

#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;
}

【讨论】:

  • 有什么理由不赞成这个答案吗?
【解决方案2】:

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

函数Func()是一个指向函数的指针,一个构成函数的指令开始的指针(内存地址)。

请参阅How do function pointers in C work? 了解说明。

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

【讨论】:

  • “成员函数”?这被标记为“C”。
  • 我知道。类似于“成员变量”,虽然不是C++中的成员函数,但让他更容易掌握概念。
  • @H2CO3 关于 C++ 的所有其他问题都被标记为“c”。
  • @H2CO3 如果 C++ 问题被标记为“c”,请对其进行编辑并重新标记,不要将其视为与 C 有关。在这种情况下,不清楚问题是关于什么的因为我们没有看到代码。
  • @n.m.从问题的文本来看,无法确定它是关于 C 还是 C++ - 两种语言对于两个不同的任务具有相同的语法。所以我认为这个问题没有弄错,这就是我认为“成员函数”术语不准确的原因。
猜你喜欢
  • 2012-05-29
  • 2020-02-05
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多