【问题标题】:What does "typedef void (*Something)()" mean“typedef void (*Something)()”是什么意思
【发布时间】:2011-04-28 07:16:45
【问题描述】:

我试图理解这意味着什么,我正在查看的代码有

在.h中

typedef void (*MCB)();
static MCB     m_process;

在.C

MCB Modes::m_process = NULL;

有时当我这样做时

m_process();

我得到分段错误,可能是因为内存被释放了,当它被释放时我该如何调试?

我希望我的问题很清楚。

【问题讨论】:

  • 嘿——你说的是C还是C++?您的 .C 文件表示 C++;您的标签表示 C。请下定决心 - 这两种语言之间存在很大差异。
  • 这绝对是 C++。 .C 是常见的 C++ 文件扩展名,而且Modes::m_process 将是无效的 C。
  • 作者明确指定了标签,他要求C,并且他多次将其编辑为C。他最初是否将某些代码与其他代码混淆,是另一个讨论。答案是对的,回答一个 C sn-p。

标签: c++ typedef static-members void-pointers


【解决方案1】:

它引入了一个函数指针类型,指向一个什么都不返回的函数(void),不带任何参数并命名为新类型MCB

【讨论】:

  • 否 - 它采用未指定的参数(因为问题被标记为 C),而不是零参数(如果它被标记为 C++)。
  • 是的,也不是。请参阅我对您的回答的评论,了解为什么我认为以这种特定方式回答(并且可能重新标记问题)是有必要的。
  • 我理解并同意/同情 - 我已经编辑了我的答案以允许可能的重新标记,并指出这一次它真的问题是否关于C 或 C++。
【解决方案2】:

它定义了一个指向函数的类型。函数返回 void,并且未指定参数列表,因为问题(当前,但可能错误地)标记为 C;如果它被标记为 C++,那么该函数将不接受任何参数。要使其成为不带参数的函数(在 C 中),您可以使用:

typedef void (*MCB)(void);

这是 C 与 C++ 之间存在显着差异的领域之一,C 还不需要在定义或使用之前对所有函数进行原型设计。

【讨论】:

  • 我会投票支持编译为 C++ 的代码,因为原始问题中的第二行使用了范围解析运算符。不过,+1 表示技术上正确。
  • 我删除了我的,因为它确实被标记为 C。我正在查看代码,但我认为是 C++。无论如何,你的两者都涵盖了,所以 +1。
  • @GMan:我理解这种困惑!
【解决方案3】:

typedef 将MCB 定义为指向不带参数的函数的指针类型,并返回void

请注意,MCB Modes::m_process = NULL; 是 C++,而不是 C。此外,在 C 中,typedef 实际上应该是 typedef void (*MCB)(void);

我不确定您所说的“内存已释放”是什么意思。您有一个指向函数的静态指针;无法释放函数。最多,您的指针已在某处重置。只需在 m_process 上使用内存监视进行调试。

【讨论】:

    【解决方案4】:

    这是一个函数指针。您收到 SEGMENTATION FAULT 是因为您尝试调用地址无效 (NULL) 的函数。

    根据您的具体示例,该函数不应返回任何值 (void) 并且不应接收任何参数 ()

    这应该可行:

    void a()
    {
        printf("Hello!");
    }
    
    int main(int arcg, char** argv)
    {
        m_process = a;
        m_process(); /* indirect call to "a" function, */
        // Hello!
    }
    

    函数指针通常用于 C 中某种形式的事件处理。虽然它不是唯一的用途...

    【讨论】:

      【解决方案5】:

      举个例子

      typedef void (*pt2fn)(int);
      

      在这里,我们定义了一个类型 pt2fn。这种类型的变量指向函数,它接受一个整数作为参数并且不返回任何值。

      pt2fn kk;
      

      这里的kk是一个pt2fn类型的变量,它可以指向任何接受整数作为输入并且不返回任何值的函数。

      参考:https://cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/function_pointers.html

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      相关资源
      最近更新 更多