1. ホーム
  2. c++

[解決済み] C++はなぜ別のヘッダーファイルが必要なのですか?

2022-04-20 08:50:39

質問

なぜC++では、.cppファイルと同じ機能を持つ別のヘッダーファイルが必要なのか、これまでよく分かりませんでした。クラスを作成したり、リファクタリングするのが非常に難しくなり、プロジェクトに不必要なファイルを追加することになります。そして、ヘッダーファイルをインクルードしなければならないのに、すでにインクルードされているかどうかを明示的にチェックしなければならないという問題があります。

C++は1998年に批准されたものですが、なぜこのような設計になっているのでしょうか?ヘッダーファイルが別にあると、どんなメリットがあるのでしょうか?


続いての質問です。

インクルードしているのは.hファイルだけなのに、コンパイラはどうやってコードのある.cppファイルを見つけるのでしょうか?.cppファイルが.hファイルと同じ名前であると仮定するのでしょうか、それとも実際にディレクトリツリー内のすべてのファイルを調べるのでしょうか?

解決方法は?

ヘッダーファイルには他の用途もありますが、定義と宣言の分離について質問されているようですね。

答えは、C++はこれを必要としない、ということです。すべてをインラインでマークすれば(クラス定義で定義されたメンバ関数ではいずれにせよ自動的にマークされます)、分離は必要ありません。ヘッダーファイルの中ですべてを定義すればいいのです。

以下のような理由が考えられます。 欲しい を分離することです。

  1. ビルド時間を改善するため。
  2. 定義のソースを持っていなくてもコードに対してリンクできるようにする。
  3. 全てを"inline"でマークしないようにする。

もしあなたの一般的な質問が、"なぜC++はJavaと同じではないのですか"であれば、私は、"なぜあなたはJavaではなくC++を書いているのですか"と聞かなければなりません; ;-p。

もっと深刻なのは、C++コンパイラは、javacのように別の翻訳ユニットに手を伸ばして、そのシンボルをどう使うかを考えることができないからです。ヘッダーファイルは、コンパイラがリンク時に利用できるものを宣言するために必要なのです。

そこで #include はそのままテキストで代入しています。ヘッダーファイルですべてを定義すると、プリプロセッサはプロジェクト内のすべてのソースファイルの膨大なコピー&ペーストを作成し、それをコンパイラに送り込むことになります。C++の標準規格が1998年に批准されたことと、C++のコンパイル環境がCのそれに非常に近いものであることは、何の関係もないのです。

フォローアップの質問に答えるために、私のコメントを変換しています。

<ブロッククオート

コンパイラは、コードの入った.cppファイルをどのように見つけるのでしょうか?

少なくとも、そのヘッダーファイルを使用したコードをコンパイルする時点では、そうではありません。リンク先の関数はまだ書かれている必要はありませんし、コンパイラがどのような .cpp ファイルに格納されます。コンパイル時に呼び出し側のコードが知るべきことは、すべて関数宣言で表現されます。リンク時には .o ファイル、静的ライブラリ、動的ライブラリ、そしてヘッダーは、事実上、関数の定義がそのどこかにあることを約束するものなのです。