まず、最初のお問い合わせに対処するには:
これを.hファイルに表示すると、次のようになります。
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
これは、ヘッダーファイルが複数回インクルードされるのを防ぐプリプロセッサテクニックです。プロジェクトのコンパイル中に、各.cppファイルが(通常は)コンパイルされます。簡単に言えば、これは、コンパイラが.cppファイルを取得し、#includedそれによってファイルを開き、それらをすべて1つの大規模なテキストファイルに連結してから、構文分析を実行し、最後にそれをいくつかの中間コードに変換し、その他を最適化/実行することを意味しますタスク、最後にターゲットアーキテクチャのアセンブリ出力を生成します。このため、ファイルが#included1つの.cppの下に複数回ある場合ファイルの場合、コンパイラはファイルの内容を2回追加するため、そのファイル内に定義がある場合、変数を再定義したことを示すコンパイラエラーが発生します。コンパイルプロセスのプリプロセッサステップでファイルが処理されると、その内容に初めて到達したときに、最初の2行でFILE_Hプリプロセッサに定義されているかどうかがチェックされます。そうでない場合は、それとディレクティブのFILE_H間のコードを定義して処理を続行します#endif。次にそのファイルの内容がプリプロセッサーによって表示されるとき、チェックFILE_Hはfalseになるため、すぐにスキャンしてまでスキャンし#endif、その後続行します。これにより、再定義エラーが防止されます。
そして、2番目の懸念事項に対処するには:
C ++プログラミングでは、一般的な方法として、開発を2つのファイルタイプに分けます。1つは拡張子が.hで、これを「ヘッダーファイル」と呼びます。これらは通常、関数、クラス、構造体、グローバル変数、typedef、前処理マクロと定義などの宣言を提供します。基本的には、コードに関する情報を提供するだけです。次に、「コードファイル」と呼ばれる.cpp拡張子を付けます。これにより、これらの関数、クラスメンバー、定義が必要な構造体メンバー、グローバル変数などの定義が提供されます。したがって、.hファイルはコードを宣言し、.cppファイルはその宣言を実装します。このため、通常はコンパイル時に各.cppをコンパイルしますオブジェクトにファイルし、それらのオブジェクトをリンクします(1つの.cppファイルに別の.cppファイルが含まれていることはほとんどないため)。
これらの外観がどのように解決されるかは、リンカの仕事です。コンパイラがmain.cppを処理するとき、class.hを含めることにより、class.cppのコードの宣言を取得します。これらの関数や変数がどのように見えるかを知る必要があるだけです(これが宣言によって与えられるものです)。そのため、main.cppファイルをいくつかのオブジェクトファイル(main.objと呼びます)にコンパイルします。同様に、class.cppはclass.objにコンパイルされますファイル。最終的な実行可能ファイルを生成するために、リンカーが呼び出され、これら2つのオブジェクトファイルをリンクします。未解決の外部変数または関数の場合、コンパイラーはアクセスが発生する場所にスタブを配置します。次に、リンカはこのスタブを取得して、リストされている別のオブジェクトファイルでコードまたは変数を検索し、見つかった場合は、2つのオブジェクトファイルのコードを出力ファイルに結合し、スタブを関数の最終的な場所に置き換えます。変数。このように、main.cppにであなたのコードは、関数と使用変数を呼び出すことができclass.cpp彼らが宣言され、場合にだけclass.h。
これがお役に立てば幸いです。