.cppファイルを作成してから.hファイルに転送したため、見つけることができる唯一の違いは、.cppファイルを#includeできないことです。欠落している違いはありますか?
C++ビルドシステム(コンパイラ)は違いを認識していないため、すべての規則に準拠しています。
慣例では、.hファイルは宣言であり、.cppファイルは定義です。
これが.hファイルが#includedされている理由です-宣言を含めます。
.cppファイルはコンパイル単位です。(C++で)コンパイルされるのは実際のソースコードファイルです。
.h(ヘッダー)ファイルは、#includeプリコンパイラー命令が表示される.cppファイルに仮想的にコピー/貼り付けされるファイルです。ヘッダーコードが.cppコードに挿入されると、.cppのコンパイルを開始できます。
宣言と定義の違いを知っています。
一方、
したがって、ヘッダーファイルの定義はすべてインラインまたは静的である必要があります。ヘッダーファイルには、複数のCPPファイルで使用される宣言も含まれています。
静的でもインラインでもない定義は、CPPファイルに配置されます。また、1つのCPPファイル内でのみ必要な宣言は、(共有可能な)ヘッダーファイルではなく、そのCPPファイル自体の中に配置されることがよくあります。
ヘッダー(_.h
_、_.hpp
_、...)ファイルには
class X { ... };
_)inline int get_cpus() { ... }
)void help();
)extern int debug_enabled;
_)ソースファイル(_.c
_、_.cpp
_、_.cxx
_)には
void help() { ... }
またはvoid X::f() { ... }
)int debug_enabled = 1;
_)ただし、ヘッダーには_.h
_サフィックスが付けられ、ソースファイルには_.cpp
_サフィックスが付けられるという規則は、実際には必要ありません。ファイル名の接尾辞(gccの場合は_-x <file-type>
_。_-x c++
_のような)に関係なく、いつでもファイルを処理する方法を優れたコンパイラに伝えることができます。
ソースファイルには、プログラム全体で一度だけ存在する必要がある定義が含まれます。したがって、ソースファイルをどこかにインクルードし、そのファイルのコンパイル結果とソースファイル自体の結果をリンクすると、当然、リンカエラーが発生します。ソースファイルを含めてから、それを含むファイルに含めました。 _.cpp
_ファイルを含めることに問題があったのはそのためです。
.hファイル、またはヘッダーファイルは、クラス宣言内のパブリックにアクセス可能なインスタンス変数とメソッドをリストするために使用されます。 .cppファイルまたは実装ファイルは、これらのメソッドを実際に実装し、それらのインスタンス変数を使用するために使用されます。
これらが分離されている理由は、.hファイルはバイナリコードにコンパイルされず、.cppファイルはコンパイルされるためです。たとえば、ライブラリを取り上げます。あなたが著者であり、それをオープンソースにしたくないとしましょう。そのため、コンパイルされたバイナリライブラリとヘッダーファイルを顧客に配布します。これにより、それらのメソッドをどのように実装したかを見ることができなくても、使用できるライブラリのクラスに関するすべての情報を簡単に確認できます。それらは、コンパイラよりもあなたのコードを使用している人々のためのものです。前に言ったように、それはコンベンションです。
目安として、「。hファイルには[潜在的に]複数のソースファイルで使用される宣言が必要ですが、実行されるコードはありません。」
他の人はすでに良い説明を提供していますが、私はさまざまな拡張機能の違いを明確にする必要があると思いました。
Cのソースファイル:.c Cのヘッダーファイル:.h C++のソースファイル:.cpp C++のヘッダーファイル:.hpp
もちろん、既に指摘されているように、これらは単なる慣例です。コンパイラーは実際には注意を払っていません-それは純粋にコーダーの利益のためです。
慣例により、.hファイルは他のファイルに含まれており、単独で直接コンパイルされることはありません。 .cppファイルは、やはり慣例により、コンパイルプロセスのルートです。これらには直接または間接的に.hファイルが含まれますが、通常は.cppファイルは含まれません。