“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)()”是啥意思的主要内容,如果未能解决你的问题,请参考以下文章