「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C90 で関数名を関数ポインターとして使用できるのはなぜですか?

C90 で関数名を関数ポインターとして使用できるのはなぜですか?

2024 年 12 月 23 日に公開
ブラウズ:137

Why Can Function Names Be Used as Function Pointers in C90?

関数名を関数ポインターとして使用する

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)
型の関数ポインタを返します。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3