3

gcc 4.0.1ビルド5370、XCode2.5を使用するMacでこの問題が発生します。コードスニペットは次のとおりです。

宣言された関数があり、2番目のパラメーターが問題を引き起こします:

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, ...);

3行目にエラーが発生します。'void func(void)'はgcc4.0.1の'void func()'とは異なるように見えます

gccスイッチまたはgccアップデートについてのアイデアは役に立ちますか?本座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には2種類あり、混ぜるとかなり混乱します。


多くのコードが初期のCで記述されているため、Cコンパイラには下位互換性が必要です。2つのスタイルを混在させることは可能ですが、ルールは完全に1つのスタイルであるプログラムに対してのみ一貫しているため、混乱やランタイムエラーが発生する可能性があります。完全に他。

レガシー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つの言語レベルの賢明なブレンドではありません。

于 2009-09-29T19:06:17.417 に答える
0

はい、void func(void)とは異なりvoid func()ます。

ただし、関数ポインターは、元の型に型キャストしvoid (*)func()たり、元の型に戻したりできます。したがって、C 関数で関数ポインター パラメーターの型を変更できます。

または、明示的なキャストを使用して、関数ポインターを強制的に正しい型にすることもできます。ほとんどのシステムでは、すべての関数ポインタは同じにおいがするため、移植可能 (またはコーシャ) ではありませんが、ほとんどのシステムで動作するはずです。

于 2009-09-29T20:38:09.913 に答える