.cpp
標準とコンパイラは、ファイルがまたはであるかどう.h
かについてはあまり気にしません.monkeyface
。ソースコードを実装ファイルとヘッダーファイルに構造化する背後にある概念は、実際には、ソースの管理を支援するための受け入れられた方法です。それにもかかわらず、受け入れられた方法でソースを構造化しないと、C++が正しくないか悪いと見なされることがよくあります。
指定したファイルの#include
内容を現在のファイルに含めるようにプリプロセッサに指示するだけです。これは、他のファイルをコピーして自分のファイルに貼り付けるようなものです。あなたが言うとき#include "foo.h"
、それはただ内容を含み、foo.h
まったく気foo.cpp
にしません-それが存在することさえ知りません(そしてそれが存在しなければならない理由はありません)。
実装ファイルとヘッダーファイルでソースコードを構造化することは非常に便利です。依存関係や複数の定義に関する問題を回避し、コンパイル時間をいくらか改善します。#include
コードで別のクラスを使用する場合は、そのクラスのヘッダーファイルのみが必要です。その理由は、コードがクラスの実装を気にする必要がなく、コードがどのように見えるか(名前、メンバー、基本クラスなど)を知る必要があるためです。メンバー関数がどのように正確に実装されているかは関係ありません。
拡張機能.cpp
と.h
は単なる規則です。.hpp
ヘッダーファイルに使用することを好む人もいます。.tpp
テンプレートの実装に使用する人もいます。好きなように名前を付けることができます-はい、.txt
ファイルを含めることもできます。コンパイラはおそらくファイル拡張子からファイルに関すること(たとえば、どの言語としてコンパイルするか)を推測しようとしますが、それは通常オーバーライド可能です。
では、クラスを使用しているためにmain.cpp
インクルードする場合、どの時点で関与しますか?さて、の編集では、それはまったく関与していません。上で説明したように、クラスの実装について知る必要はありません。ただし、プログラム全体をコンパイルするときは、各ファイルをコンパイラーに渡して、個別にコンパイルします。つまり、のようなことをします。がコンパイルされると、コンパイルに必要なヘッダーが含まれます。foo.h
foo
foo.cpp
main.cpp
main.cpp
.cpp
g++ main.cpp foo.cpp
foo.cpp
各.cpp
ファイルがコンパイルされた後(依存するヘッダーを含める必要があります)、ファイルは相互にリンクされます。でのメンバー関数の使用は、foo::bar()
この段階でで与えられmain.cpp
た実装にリンクされます。foo::bar()
foo.cpp