web-dev-qa-db-ja.com

.cppファイルと.hファイルの違いは何ですか?

.cppファイルを作成してから.hファイルに転送したため、見つけることができる唯一の違いは、.cppファイルを#includeできないことです。欠落している違いはありますか?

53
user98188

C++ビルドシステム(コンパイラ)は違いを認識していないため、すべての規則に準拠しています。

慣例では、.hファイルは宣言であり、.cppファイルは定義です。

これが.hファイルが#includedされている理由です-宣言を含めます。

52
Macker

.cppファイルはコンパイル単位です。(C++で)コンパイルされるのは実際のソースコードファイルです。

.h(ヘッダー)ファイルは、#includeプリコンパイラー命令が表示される.cppファイルに仮想的にコピー/貼り付けされるファイルです。ヘッダーコードが.cppコードに挿入されると、.cppのコンパイルを開始できます。

22
Klaim

宣言と定義の違いを知っています。

一方、

  • CPPファイルには、含まれるヘッダーの定義が含まれます(CPPとヘッダーファイルが一緒になって単一の「翻訳単位」になるため)
  • ヘッダーファイルが複数のCPPファイルに含まれている場合があります
  • リンカは通常、複数のCPPファイルで定義されたものを好まないでしょう。

したがって、ヘッダーファイルの定義はすべてインラインまたは静的である必要があります。ヘッダーファイルには、複数のCPPファイルで使用される宣言も含まれています。

静的でもインラインでもない定義は、CPPファイルに配置されます。また、1つのCPPファイル内でのみ必要な宣言は、(共有可能な)ヘッダーファイルではなく、そのCPPファイル自体の中に配置されることがよくあります。

12
ChrisW

ヘッダー(_.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ファイルはコンパイルされるためです。たとえば、ライブラリを取り上げます。あなたが著者であり、それをオープンソースにしたくないとしましょう。そのため、コンパイルされたバイナリライブラリとヘッダーファイルを顧客に配布します。これにより、それらのメソッドをどのように実装したかを見ることができなくても、使用できるライブラリのクラスに関するすべての情報を簡単に確認できます。それらは、コンパイラよりもあなたのコードを使用している人々のためのものです。前に言ったように、それはコンベンションです。

7
Marc W

目安として、「。hファイルには[潜在的に]複数のソースファイルで使用される宣言が必要ですが、実行されるコードはありません。」

1
dj_segfault

他の人はすでに良い説明を提供していますが、私はさまざまな拡張機能の違いを明確にする必要があると思いました。

 Cのソースファイル:.c 
 Cのヘッダーファイル:.h 
 
 C++のソースファイル:.cpp 
 C++のヘッダーファイル:.hpp 

もちろん、既に指摘されているように、これらは単なる慣例です。コンパイラーは実際には注意を払っていません-それは純粋にコーダーの利益のためです。

1
Noldorin

慣例により、.hファイルは他のファイルに含まれており、単独で直接コンパイルされることはありません。 .cppファイルは、やはり慣例により、コンパイルプロセスのルートです。これらには直接または間接的に.hファイルが含まれますが、通常は.cppファイルは含まれません。

0
bdonlan