繁体   English   中英

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

[英]What does "typedef void (*Something)()" mean

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

在.h

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

在.C

MCB Modes::m_process = NULL;

有时当我这样做时

m_process();

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

我希望我的问题很清楚。

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

typedef void (*MCB)(void);

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

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

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

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

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

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

让我们举个例子

typedef void (*pt2fn)(int);

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

pt2fn kk;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM