“typedef void (*Something)()”是啥意思

Posted

技术标签:

【中文标题】“typedef void (*Something)()”是啥意思【英文标题】: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。 【参考方案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

【讨论】:

如果我们有一个类似 void fun(int a) 的函数,那么 kk=fun。现在 kk 指向函数 fun(int a)。您可以使用 kk(4) 调用该函数。我们也可以使用 kk=&fun。参考:cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/…

以上是关于“typedef void (*Something)()”是啥意思的主要内容,如果未能解决你的问题,请参考以下文章