“typedef void (*Something)()”的意思是什么?

56

我试图理解这是什么意思,我正在查看的代码中有

.h中。

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

.C

MCB Modes::m_process = NULL;

有时候当我这样做的时候

m_process();

我遇到了段错误,可能是因为内存被释放了。如何在内存被释放时进行调试?


12
嘿,你在谈论C还是C++?你的.C文件表明是C++,而你的标签显示是C。做出决定吧,这两种语言之间有很大的区别。 - Jonathan Leffler
7
这明确是C++。.C 是常见的 C++ 文件扩展名,而且 Modes::m_process 在 C 中是无效的。 - SingleNegationElimination
作者明确指定了标签,他要求使用C语言,并多次编辑为C。无论他最初是否将某些代码与其他代码混淆,这是另一回事。答案是正确的,回答了一个C代码片段。 - another
5个回答

55

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

typedef void (*MCB)(void);

这是C和C++之间存在显著区别之一的领域之一,C在定义或使用函数之前不需要原型,但C++需要。


1
我会投票支持将代码编译为C++,因为原问题的第二行使用了作用域解析运算符。不过,对于技术上的正确性还是要点个赞。 - Jim Brissom
1
我删除了我的代码,因为它确实标记为C语言。虽然我看的是代码,但我认为是C++。无论如何,你的代码都涵盖了两者,所以给你点赞。 - GManNickG
1
@GMan:我理解你的困惑! - Jonathan Leffler

8

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

6
它引入了一个函数指针类型,指向返回空值(void),不带任何参数并命名为MCB的函数。

1
不是零参数(如果标记为C++,则为零参数),而是未指定参数(因为问题标记为C)。 - Jonathan Leffler
是的,也不是。请看我对你的回答的评论,我认为以那种特定的方式回答(并可能重新标记问题)是必要的。 - Jim Brissom
我理解并同意/同情 - 我已编辑我的答案以允许可能的重新标记,并指出这次问题是关于C还是C ++,这真的很重要。 - Jonathan Leffler

5
typedef 将 MCB 定义为指向不带参数且返回 void 的函数的类型。
请注意,MCB Modes::m_process = NULL; 是 C++ 而非 C。在 C 中,typedef 应该是 typedef void (*MCB)(void);
我不确定你所说的“内存已被释放”是什么意思。您有一个静态指向函数的指针;函数不能被释放。最多,您的指针在某个地方被重置了。只需在 m_process 上调试内存监视即可。

4

这是一个函数指针。你得到了一个段错误,因为你试图调用一个地址无效的函数(NULL)。

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

以下代码应该可以工作:

void a()
{
    printf("Hello!");
}

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

函数指针在C语言中通常用于某种形式的事件处理。但这并不是它唯一的用途...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接