関数名を関数ポインターとして使用する
C90 の理論的根拠に関する文書は、関数名を関数ポインターと同等にする設計上の選択についての洞察を提供します。この利便性により、特定のコンテキストでの関数ポインターの使用が簡素化されます。
関数宣言
次の宣言を検討してください。
int f(); int (*pf)();
関数呼び出し
次のすべての有効な明示的な関数呼び出し:
(&f)(); f(); (*f)(); (**f)(); (***f)(); pf(); (*pf)(); (**pf)(); (***pf)();
各行の最初の式については前に説明しました。 2つ目は従来型です。後続の式は、ほとんどのコンテキストで関数指定子からポインタ値への暗黙的な変換を暗示します。
設計の理論的根拠
委員会は、これらの形式を許可することに重大な欠点はないと考え、検討しました。過度の努力としてそれらを禁止します。したがって、関数指定子と関数ポインターが等価であることにより、ポインターの使用が便利になります。
暗黙的な変換
もう 1 つの興味深い観察は、使用時に関数型がポインターに暗黙的に変換されることです。戻り値の型としてではなくパラメーターとして:
typedef bool FunctionType(int); void g(FunctionType); // Implicitly converts to void g(FunctionType *) FunctionType h(); // Error FunctionType *j(); // Returns a function pointer with the type bool(int)
以上がC90 で関数名を関数ポインターとして使用できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。