-4

C++ コンパイラは、どの変換単位またはソース ファイルでヘッダー内の宣言を見つけることができるかをどのように認識しますか? つまり、ヘッダー内のさまざまな宣言の実装は、複数のファイルに含めることができますよね? では、コンパイラはどれを選択するかをどのように判断するのでしょうか?

また、外部変数が使用されている場合、コンパイラはそれがどのファイルで定義されているかをどのように認識しますか?

4

2 に答える 2

1

コンパイラは、定義がどこにあるかを知りません。

リンカーは、コンパイルされたオブジェクトを調べ、ヘッダーを含むオブジェクトを、関数または外部変数の実装を含むオブジェクト/ライブラリとリンクするツールです。リンカーは、一緒にする必要があるオブジェクト ファイルとライブラリのリストと、参照する必要があるそれらのリストを入力として受け取ります。

于 2013-10-24T11:56:50.620 に答える
-1

元の質問の用語が原因で、質問を誤解していたため、この回答は実際には質問に回答していません。ただし、プリプロセッサに関する今後の参考のためにここに残しておきます。


プリプロセッサのディレクティブは、ソース ファイル内のディレクティブがあった場所に、含まれているすべての#includeヘッダーの内容を含む一時ファイルを作成していると見なすことができます。#include

GCC を使用している場合は-E、ファイルをコンパイルするときにオプションを使用して、GCC に前処理段階の後に停止するように指示することができます。これにより、このファイルを自分で確認できます。

特定の宣言がどのファイルおよびソース行にあるかをコンパイラーが認識できるように、プリプロセッサーはいわゆる「行」ディレクティブを出力します。これらは、現在のファイル名と行番号を設定するためにコンパイラが認識して使用する特別なディレクティブ (およびプリプロセッサ ディレクティブによく似ています) です。たとえば、GCC マニュアルのこの部分を参照してください。

于 2013-10-24T11:58:27.687 に答える