错误:从'void(*)(...)'到'void(*)()的无效转换

时间:2009-09-29 15:21:16

标签: c void-pointers

在Mac上使用gcc 4.0.1 build 5370,XCode 2.5出现此问题。 代码段是:

有一个声明的函数,第二个参数导致问题:

void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) 

这样称呼它:

typedef void (*FuncPtr)();
FuncPtr func = some_function_pointer;
ffi_call(null, func, ...);

导致第三行错误。看起来'void func(void)'与gcc 4.0.1的

任何关于gcc开关或gcc更新的想法都有帮助吗? 感谢帮助 Honza B。

3 个答案:

答案 0 :(得分:3)

如果您使用C编程,则void func()void func(void)不一样。 void func()相当于void func(...)。 (这与C ++不同。)

您可以尝试确保代码编译为C ++(如果这是您实际想要的),或者只是将FuncPtr typedef更改为typedef void (*FuncPtr)(void)

答案 1 :(得分:0)

C有两种,混合它们会让人感到困惑。


C编译器需要向后兼容,因为很多代码是在早期C编写的。可以混合使用这两种样式,但这可能会导致混淆甚至运行时错误,因为这些规则只对完全相同的程序是一致的一种风格或完全另一种风格。

在传统C(“K& R C”)中有类似的内容:f(){/* stuff */}

double f(d)
double d;
{ stuff }

遗留样式中的前向声明可能会使用(),即使它真的是(d),因为无法指定类型,因此在使用形式参数方面没什么意义。

符合C89和C99标准的样式,您对声明有double f(double);,定义有double f(double d) { /* stuff */}double f(void)是ANSI的做法,但double f()仍然是“合法的”,但却是两种语言级别的不明智的混合。

答案 2 :(得分:0)

是的,void func(void)void func()不同。

但是任何函数指针都可以强制转换为void (*)func()并返回其原始类型。因此,您可以在C函数中更改函数指针参数的类型。

或者您可以通过显式强制转换强制将函数指针设置为正确的类型。在大多数系统中,所有函数指针都闻起来一样,所以即使它不是可移植的(或犹太教),它仍然适用于大多数系统。