[解決済み] C++はなぜ別のヘッダーファイルが必要なのですか?
質問
なぜC++では、.cppファイルと同じ機能を持つ別のヘッダーファイルが必要なのか、これまでよく分かりませんでした。クラスを作成したり、リファクタリングするのが非常に難しくなり、プロジェクトに不必要なファイルを追加することになります。そして、ヘッダーファイルをインクルードしなければならないのに、すでにインクルードされているかどうかを明示的にチェックしなければならないという問題があります。
C++は1998年に批准されたものですが、なぜこのような設計になっているのでしょうか?ヘッダーファイルが別にあると、どんなメリットがあるのでしょうか?
続いての質問です。
インクルードしているのは.hファイルだけなのに、コンパイラはどうやってコードのある.cppファイルを見つけるのでしょうか?.cppファイルが.hファイルと同じ名前であると仮定するのでしょうか、それとも実際にディレクトリツリー内のすべてのファイルを調べるのでしょうか?
解決方法は?
ヘッダーファイルには他の用途もありますが、定義と宣言の分離について質問されているようですね。
答えは、C++はこれを必要としない、ということです。すべてをインラインでマークすれば(クラス定義で定義されたメンバ関数ではいずれにせよ自動的にマークされます)、分離は必要ありません。ヘッダーファイルの中ですべてを定義すればいいのです。
以下のような理由が考えられます。 欲しい を分離することです。
- ビルド時間を改善するため。
- 定義のソースを持っていなくてもコードに対してリンクできるようにする。
- 全てを"inline"でマークしないようにする。
もしあなたの一般的な質問が、"なぜC++はJavaと同じではないのですか"であれば、私は、"なぜあなたはJavaではなくC++を書いているのですか"と聞かなければなりません; ;-p。
もっと深刻なのは、C++コンパイラは、javacのように別の翻訳ユニットに手を伸ばして、そのシンボルをどう使うかを考えることができないからです。ヘッダーファイルは、コンパイラがリンク時に利用できるものを宣言するために必要なのです。
そこで
#include
はそのままテキストで代入しています。ヘッダーファイルですべてを定義すると、プリプロセッサはプロジェクト内のすべてのソースファイルの膨大なコピー&ペーストを作成し、それをコンパイラに送り込むことになります。C++の標準規格が1998年に批准されたことと、C++のコンパイル環境がCのそれに非常に近いものであることは、何の関係もないのです。
フォローアップの質問に答えるために、私のコメントを変換しています。
<ブロッククオートコンパイラは、コードの入った.cppファイルをどのように見つけるのでしょうか?
少なくとも、そのヘッダーファイルを使用したコードをコンパイルする時点では、そうではありません。リンク先の関数はまだ書かれている必要はありませんし、コンパイラがどのような
.cpp
ファイルに格納されます。コンパイル時に呼び出し側のコードが知るべきことは、すべて関数宣言で表現されます。リンク時には
.o
ファイル、静的ライブラリ、動的ライブラリ、そしてヘッダーは、事実上、関数の定義がそのどこかにあることを約束するものなのです。
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】C++のコンパイルにはなぜそんなに時間がかかるのですか?
-
[解決済み] なぜcppファイルをインクルードせず、ヘッダを使用する必要があるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] なぜヘッダーファイルと.cppファイルがあるのですか?[クローズド]