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

时间:2010-10-20 21:30:21

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

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

in .h

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

in .C

MCB Modes::m_process = NULL;

有时我做的时候

m_process();

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

我希望我的问题很明确。

5 个答案:

答案 0 :(得分:44)

它定义了一个指向函数的指针类型。函数返回void,并且参数列表未指定,因为问题是(当前,但可能是错误地)标记为C;如果它被标记为C ++,则该函数根本不会参数。为了使它成为一个不带参数的函数(在C中),你可以使用:

typedef void (*MCB)(void);

这是C之间存在显着差异的领域之一,C还没有 - 要求所有函数在定义或使用之前都要进行原型化,而C ++则需要。

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:3)

这是一个函数指针。你得到一个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中的某种形式的事件处理。虽然它不是唯一的用途......

答案 4 :(得分:1)

让我们举个例子

typedef void (*pt2fn)(int);

在这里,我们正在定义类型pt2fn。这种类型的变量指向以整数作为参数且不返回任何值的函数。

pt2fn kk;

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