C 错误:从';无效(*)(…)和#x27;至';无效(*)和#x27;

C 错误:从';无效(*)(…)和#x27;至';无效(*)和#x27;,c,void-pointers,C,Void Pointers,使用GCC4.0.1构建5370,XCode 2.5在Mac上存在此问题。 代码片段是: 有一个声明的函数,第二个参数导致问题: 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, ...); 导致第三行出现错误

使用GCC4.0.1构建5370,XCode 2.5在Mac上存在此问题。 代码片段是:

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

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, ...);
导致第三行出现错误。对于gcc 4.0.1,看起来“void func(void)”与“void func()”不同

任何关于gcc切换或gcc更新的想法都会有帮助吗? 谢谢你的帮助
Honza B.

如果您是用C编程,
void func()
void func(void)
是不同的
void func()
相当于
void func(…)
。(这与C++不同)


<>你可以尝试确保代码被编译成C++(如果这就是你真正想要的),或者如果不是,只需改变你的代码>函数pPtRt/<代码> TyPulf到<代码> TyPulfValb(*FoMPTR)(空) > P有两种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()
仍然是“合法的”,但它是两种语言级别的不明智的混合。

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

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


或者,您可以强制函数指针为具有显式强制转换的正确类型。在大多数系统上,所有函数指针的味道都是一样的,所以即使它不是便携式的(或犹太的),它也应该在大多数系统上工作。

谢谢你的回答。不幸的是,代码被编译为C。我无法更改FuncPtr。应该有可能更改函数声明,而不是。但我相信一些配置或gcc更新(例如与build 5484一起使用)会有所帮助
是接受未指定但固定数量参数的函数的原型<代码>无效函数(…)是接受可变数量参数的函数的原型。但声明的不同之处在于:void(*ptr)()void(*ptr)(void),这两个函数都没有参数。没有。。。在声明中。@Honza:C(不是C++)中,
void(*ptr)(
表示“指向带未指定参数的函数的指针”,而
void(*ptr)(void)
表示“指向不带参数的函数的指针”。没有这个开关;这就是C的工作方式。如果你切换到C++,它们也将意味着同样的事情。现在我明白了。我熟悉C++,然后C.Hyth.Studio Cases就是解决问题的方法。谢谢你的回答。不需要移植性,因为代码是平台专用的(仅限mac)。我可以确认新版本GCC4.0.1能够很好地处理这个问题(或者实际上是错误的)。不确定它是变成警告还是完全被忽略。