3

在使用 gcc 4.0.1 build 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, ...);

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

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

4

3 回答 3

3

如果你是用C编程的,那就void func()void func(void)一样了。void func()相当于void func(...)。(这与 C++ 不同。)

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

于 2009-09-29T15:32:40.457 回答
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()仍然是“合法的”,但不明智地混合了两种语言级别。

于 2009-09-29T19:06:17.417 回答
0

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

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

或者您可以通过显式强制转换将函数指针强制为正确的类型。在大多数系统上,所有函数指针的气味都相同,因此即使它不是可移植的(或符合犹太教规的),它仍然可以在大多数系统上工作。

于 2009-09-29T20:38:09.913 回答