2009-05-17 163 views
44

.cppファイルを.hファイルに変換したため、#cppファイルを#includeできないという唯一の違いがあります。私は行方不明に違いはありますか?.cppファイルと.hファイルの違いは何ですか?

+7

実際には、.cppファイルを含めることができます。あなたはあなたが望むものを含めることができます。 –

+0

以下の人々の回答を理解するには、別の質問をする必要があります。「C++の '宣言」と「定義」の違いは何ですか? – ChrisW

+1

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

答えて

42

C++ビルドシステム(コンパイラ)は違いがないことを知っているので、それはすべての慣習です。

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

だからこそ、.hファイルは#includeされています。これには宣言が含まれています。

+0

C++ビルドシステムは区別されます。たとえば、.hファイルと.cppファイルに対してg ++を実行し、何が起こるかを確認します。 –

+0

私は、.hファイルで宣言されている関数/クラス/ etcを定義するために.cppファイルが(ほとんどの場合)使用されていますが、.hファイルでも変数を定義することができます。 –

+5

@Neil Butterworth:はい、G ++コンパイラは規約を理解していますが、強制的にコンパイルすることはできます。 –

0

慣習的に、.hファイルは他のファイルに含まれており、決してそれ自体では直接コンパイルされません。 .cppファイルは、慣習により、コンパイルプロセスのルーツです。 .hファイルには直接的または間接的に含まれますが、通常は.cppファイルではありません。

17

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

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

+0

なぜ.cppファイルで、.cppファイルではないのですか? –

+9

@ Keand64:コンパイル時には、コンパイル時に一度に* 1つの* .cppファイルしか見ないためです。 .cppファイルを読み込み、すべての#include .hファイルを読み込み、すべてをコンパイルし、.o(または.obj)ファイルを書き込み、次の.cppファイルに進みます。 –

6

.hファイル、またはヘッダーファイルは、クラス宣言内の一般にアクセス可能なインスタンス変数とメソッドをリストするために使用されます。 .cppファイル、または実装ファイルは、実際にこれらのメソッドを実装し、それらのインスタンス変数を使用するために使用されます。

.cppファイルがあるうちに、.hファイルがバイナリコードにコンパイルされないため、それらが分離されている理由があります。例えば、図書館に行く。あなたが作者であり、オープンソースであることを望まないとします。したがって、コンパイルされたバイナリライブラリとヘッダファイルを顧客に配布します。これにより、それらのメソッドをどのように実装したかを見ることができなくても、使用できるライブラリのクラスに関するすべての情報を簡単に見ることができます。コンパイラではなく、コードを使用する人のためのものです。前に言われたように、それは大会です。

1

その他は、すでに良い説明を提供してきましたが、私は、私は様々な拡張との違いを明確にすべきと思った。もちろん

 
    Source Files for C: .c 
    Header Files for C: .h 

    Source Files for C++: .cpp 
    Header Files for C++: .hpp 

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

+3

ほとんどの人は、C++にも.hを使用しています。 – Zifre

+0

@Zifre:そうです。だから、多くの人がそれらに従わないかもしれませんが、これらは*推奨命名規則*です。 – Noldorin

1

「.hファイルは、複数のソースファイルで宣言される可能性がありますが、実行されるコードはありません」という経験則があります。

5

ヘッダ(.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++のように)とは無関係に、良いコンパイラに何らかのファイルを扱う方法を常に伝えることができます。

ソースファイルには、プログラム全体で1回だけ存在しなければならない定義が含まれます。したがって、ソースファイルをどこかに入れてから、そのファイルのコンパイル結果とソースファイルそのものを一緒にリンクすると、リンカエラーが発生します。インクルードされたソースファイル、そしてそれを含むファイルの中にあります。そのため、.cppファイルを含むことに問題がありました。

12

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

に対し:

  • CPPファイルは、ヘッダファイルが含まれている場合があります
  • (CPPおよびヘッダファイルが一緒になって単一の「変換部」になるため)、それが含む任意のヘッダの定義を含みます
  • つ以上のCPPファイルによって、リンカーは、通常、複数のCPPで定義されたものは

ファイルを好きではないだろうヘッダファイル内の定義はインラインまたはスタティックでなければなりません。ヘッダーファイルには、複数のCPPファイルで使用される宣言も含まれています。

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

関連する問題