14

少し混乱しています。前方宣言と前方参照の違いは何ですか? 前方宣言とは、私の頭では、まだ実装されていない関数を宣言することですが、これは間違っていますか? ケースを「前方参照」または「前方宣言」を宣言するために、指定された状況を見る必要がありますか?

4

3 に答える 3

32

前方宣言は、実装して使用する前のメソッドまたは変数の宣言です。前方宣言の目的は、コンパイル時間を節約することです。

変数の前方宣言により、記憶領域が確保されるため、後でその変数の値を設定できます。

関数の前方宣言は「関数プロトタイプ」とも呼ばれ、関数の戻り値の型、関数の名前、およびそのパラメーターの型をコンパイラーに伝える宣言ステートメントです。C/C++ や Pascal などの言語のコンパイラは、宣言されたシンボル (関数を含む) をルックアップ テーブルに格納し、コード内で検出されたときにそれらを参照します。これらのコンパイラは、コードを上から下に順番に読み取るため、前方宣言を行わないと、コンパイラはルックアップ テーブルで参照できないシンボルを検出し、不明なエラーを発生させます。関数への応答方法。

前方宣言は、関数を別の場所で定義した (実装を記入した) コンパイラへのヒントです。

例えば:

int first(int x); // forward declaration of first

...

int first(int x) {
   if (x == 0) return 1;
   else return 2;
}

しかし、すべてのソース ファイルに対してコンパイラに 2 つのパスを作成させてはどうでしょうか。1 つ目は内部のすべてのシンボルにインデックスを付け、2 つ目は参照を解析して検索します。ダン・ストーリーによると:

1972 年に C が作成されたとき、コンピューティング リソースははるかに不足しており、非常に高価でした。複雑なプログラムのシンボリック テーブル全体を一度に格納するために必要なメモリは、ほとんどのシステムで利用できませんでした。固定ストレージも高価であり、非常に遅いため、仮想メモリやシンボリック テーブルの一部をディスクに保存するなどのアイデアでは、合理的な時間枠でコンパイルすることはできませんでした...シーク時間がかかる磁気テープを扱っている場合秒単位で測定され、読み取りスループットは 1 秒あたりのバイト数 (キロバイトまたはメガバイトではなく) で測定されました。これはかなり意味のあるものでした。

C++ は、ほぼ 17 年後に作成されましたが、C のスーパーセットとして定義されていたため、同じメカニズムを使用する必要がありました。

1995 年に Java が登場する頃には、平均的なコンピューターには十分なメモリがあり、複雑なプロジェクトであってもシンボリック テーブルを保持することは、もはや大きな負担ではありませんでした。また、Java は C との下位互換性を持たないように設計されていたため、従来のメカニズムを採用する必要はありませんでした。C# も同様に妨げられませんでした。

その結果、設計者は、シンボリック宣言を区分化する負担をプログラマーから解放し、再びコンピューターに任せることを選択しました。これは、コンパイルの総労力に比例するコストが最小限であったためです。

Java と C# では、識別子はソース ファイルから自動的に認識され、動的ライブラリ シンボルから直接読み取られます。これらの言語では、同じ理由でヘッダー ファイルは必要ありません。

前方参照はその逆です。宣言前のエンティティの使用を指します。例えば:

int first(int x) {
   if (x == 0) return 1;
   return second(x-1); // forward reference to second
}

int second(int x) {
   if (x == 0) return 0;
   return first(x-1);
}

「前方参照」は、「前方宣言」の同義語として使用されることもありますが、それほど頻繁ではありません。

于 2012-01-21T21:47:35.540 に答える
6

ウィキペディアから:

前方宣言

まだ定義されていない変数または関数の宣言。それらの定義は後で見ることができます。

フォワードリファレンス

前方宣言に似ていますが、変数または関数が最初に表示される場合、定義も配置されます。

于 2009-03-30T09:40:53.027 に答える
3

前方宣言は、言語 (C、Pascal) のシングルパス コンパイルを可能にするために使用されます。

前方宣言なしで前方参照が許可されている場合 (Java、C#)、2 パス コンパイラが必要です。

于 2009-03-30T09:37:08.480 に答える