ホームページ >バックエンド開発 >C++ >関数名と関数ポインタが C で同じなのはなぜですか?

関数名と関数ポインタが C で同じなのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-12 21:09:01649ブラウズ

Why are Function Names and Function Pointers Equivalent in C  ?

関数ポインターと同等の関数名

C の関数名は、関数指定子と関数ポインターの両方として機能し、関数を参照するための便利な短縮表現を提供します。 。この等価性については議論があり、その理論的根拠は、歴史的考察と関数ポインターの使用を簡略化したいという要望にあります。

C90 理論的文書では、関数指定子は関数呼び出し (両方とも関数呼び出し) としてなど、複数の形式で使用できると説明されています。アスタリスク演算子なし) および関数ポインターとして。この柔軟性により、さまざまな構文構造が可能になりますが、その中には珍しいと思われるものもあるでしょう。

たとえば、次の宣言を考えてみましょう。

int f();
int (*pf)();

ここで、関数名 f は f( )、*f()、さらには ***f()。さらに、関数ポインタ pf は、pf()、*pf()、**pf() などの同様の方法で呼び出すことができます。

この等価性の理論的根拠は、使用を簡素化したいという要望から生じています。関数ポインタの。多くの場合、アドレス演算子 (&) を手動で適用するよりも、関数名を関数ポインターとして直接使用する方が便利です。したがって、この言語では関数名と関数ポインターを等価にすることができます。

ただし、この等価性は特定のコンテキストに限定されます。関数型を返す場合、関数型自体をそれ自体へのポインターに暗黙的に変換することはできません。これを以下の例に示します。

typedef bool FunctionType(int);
FunctionType h(); // Error!

この場合、 h() は関数型を返す関数として宣言されていますが、これをその関数型へのポインターに暗黙的に変換することはできません。ただし、パラメーターとして使用すると、関数型をそれ自体へのポインターに暗黙的に変換できます。

FunctionType g(FunctionType); // Implicitly converted to void g(FunctionType *)

この暗黙的な変換により、関数ポインターをパラメーターとして渡すことが簡単になります。全体として、関数名と関数ポインターの等価性は、利便性とコンテキスト上の制限のバランスをとる設計上の選択であり、C プログラミングにおける実用的な機能となっています。

以上が関数名と関数ポインタが C で同じなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。