什么是 “无效的typedef(*的东西)()” 的意思是

问题描述:

我想明白这意味着什么,代码我在看有什么是 “无效的typedef(*的东西)()” 的意思是

在.H

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

在.C

MCB Modes::m_process = NULL; 

有时,当我做

m_process(); 

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

我希望我的问题很清楚。

+9

喂 - 你说的是C或C++ ?您的.C文件指示C++;你的标签表明C.让你放心 - 这里的两种语言有很大的区别。 – 2010-10-20 21:36:22

+6

这绝对是C++。 '.C'是一个常见的C++文件扩展名,此外'Modes :: m_process'将是无效的C. – SingleNegationElimination 2010-10-20 22:48:15

+0

作者已经明确指定了标签,他要求C,并且他已经多次对C进行了编辑。无论他是最初与其他一些代码混淆,是另一种讨论。答案是正确的,回答一个C片段。 – another 2017-10-19 10:24:30

它定义了一个指向函数的类型。函数返回void,并且参数列表未指定,因为问题是(当前,但可能错误地)标记为C;如果它被标记为C++,那么该函数根本不会有任何参数。要使它成为一个功能,它没有参数(C语言),你会使用:

typedef void (*MCB)(void); 

这是有C的显著差异,这不的地区之一 - 然而 - 需要的所有功能在被定义或使用之前被原型化,以及C++。

+1

由于原始问题中的第二行使用范围解析运算符,因此我会为正在编译为C++的代码投票。仍然是+1,因为技术上是正确的。 – 2010-10-20 21:36:50

+1

我删除了我的,因为它确实被标记为C.我正在查看代码,但我认为是C++。无论如何,你们都涵盖了这两个方面,所以+1。 – GManNickG 2010-10-20 21:41:31

+1

@GMan:我明白混乱! – 2010-10-20 21:44:46

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

+1

否 - 它需要未指定的参数(因为问题标记为C),而不是零参数(如果标记为C++)。 – 2010-10-20 21:33:52

+0

是的,没有。对于我的回答,请参阅我的评论,以了解为什么我认为以特定方式回答(并可能重新标记问题)是有条理的。 – 2010-10-20 21:39:51

+0

我理解并同意/同情 - 我编辑了我的答案以允许可能的重复,并且指出这一次*真的很重要,问题是关于C还是C++。 – 2010-10-20 21:42:35

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

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

我不确定你的意思是“内存被释放”。你有一个指向函数的静态指针;一个函数不能被释放。至多,你的指针已经被重置了。只需在m_process上使用内存手表进行调试。

这是一个函数指针。由于您试图拨打某个功能的地址无效(NULL),您会收到SEGMENTATION FAULT(分段故障)。

根据您的具体样本,该函数不应返回任何值(void),并且不应收到参数()

这应该工作:

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

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

函数指针通常用于某种形式的事件C.处理的这不是它虽然只使用...