adream307 から質問がありましたが、わかりません。あなたの質問はどうですか?
次のような関数を宣言したい: (このタイプの関数を F と名付けた)
- F の戻り値の型は「void」です
- F のパラメーターは関数ポインターです。このポインターは、型が F と同じ関数を指します。
このような関数を宣言できますか?
adream307 から質問がありましたが、わかりません。あなたの質問はどうですか?
次のような関数を宣言したい: (このタイプの関数を F と名付けた)
- F の戻り値の型は「void」です
- F のパラメーターは関数ポインターです。このポインターは、型が F と同じ関数を指します。
このような関数を宣言できますか?
いいえ、あなたがすることはできません。タイプは繰り返されるため、表現できません。
void f(void g(void h(...
しかし、自分自身を受け入れる関数を問題なく書くことができます。検討
void f(void g()) { }
int main(void) { f(f); }
それはまったく問題ありません。のパラメーターの型は、 の型と互換性のある型をf
持つ関数ポインター (ここでvoid g()
は と同等) です。呼び出しのパラメーターと引数の両方の関数型の互換性に関する規則であり、次のように指定されます。void (*g)()
f
f
void()
void (void())
一方の型にパラメーター型リスト [呼び出し引数] があり、もう一方の型が、関数定義の一部ではなく、空の識別子リスト [関数パラメーター型] を含む関数宣言子によって指定されている場合、パラメーター リストは、省略記号ターミネータがあり、各パラメータの型は、デフォルト引数の昇格を適用した結果の型と互換性がある必要があります。
どちらのタイプもこの互換性ルールを満たしているため、関数呼び出しは明確に定義されています。