【问题标题】:Please explain this use of typedef [duplicate]请解释 typedef 的这种用法 [重复]
【发布时间】:2013-09-15 01:17:49
【问题描述】:

代码如下:

// Global Definitions/Declarations:

typedef void * LOGHANDLE;

typedef LOGHANDLE (STD_CALL *LogOpen_T)
       (unsigned char *, 
        unsigned char *, 
        unsigned long, 
        unsigned long *);

LogOpen_T LogOpen;

// Inside some function:
    ...
    LogOpen = (LogOpen_T)ImportSymbol(moduleHandle, "LogOpen" );
    if (LogOpen == NULL)
    {
         err = -2;
    }
    ...

我无法理解这里如何使用typedef。请解释一下。

【问题讨论】:

  • 去掉“typedef”这个词……那你明白了吗?如果不是,那么您的问题不在于 typedef。如果是这样,那么您理解 typedef 应该没有任何问题。
  • @JimBalter:我还记得我第一次看到 typedef 作为函数指针时是多么的恼火。
  • @alk 我无法理解。就像我说的,如果你已经理解了函数指针的声明——这是令人讨厌的部分,因为 C 如何将声明的名称隐藏在一堆语法中——那么理解 typedef 很简单,因为它只是将名称声明为类型的同义词,而不是类型的变量。

标签: c function pointers typedef


【解决方案1】:

typedef 本身为指向函数的指针定义了一个类型别名,该函数看起来像:

void * STD_CALL f(unsigned char *, unsigned char *, unsigned long, unsigned long *);

变量LogOpen 是实际的函数指针。稍后ImportSymbol 的结果被强制转换为指向函数的指针。

【讨论】:

    【解决方案2】:

    LOGHANDLE 定义了一个可以指向任何东西的指针。 LogOpen_T 定义了一个函数指针。

    【讨论】:

      【解决方案3】:

      这是一个指向原型函数的指针

      LONGHANDLE functionname
         (unsigned char *, 
          unsigned char *, 
          unsigned long, 
          unsigned long *);
      

      使用示例

      LOGHANDLE mylogfunction
         (unsigned char *, 
          unsigned char *, 
          unsigned long, 
          unsigned long *){/* code*/}
      
      
      LogOpen_T function_handle = (LogOpen_T)(&mylogfunction);
      

      【讨论】:

        猜你喜欢
        • 2017-04-06
        • 2017-01-03
        • 2021-07-10
        • 2022-01-12
        • 1970-01-01
        • 2012-03-11
        • 2015-03-28
        • 2019-05-25
        • 2019-01-19
        相关资源
        最近更新 更多