私は c++ を学ぶのが初めてで、複数のヘッダー ファイルの目的が何であるかについて興味がありました。すべてを 1 つのヘッダー ファイルに収めることができないのはなぜですか?
6 に答える
ここでのキーワードはモジュール性です:
モジュール性とは、システムのコンポーネントを分離および再結合できる度合いです。
他の人がすでに述べたように、プログラムは単一のファイルに記述できます。しかも一行で書ける。ただし、これを行うと、このプログラムの一部を分離して再結合することが非常に困難になるため、コンパイルしない場合にデバッグすることは言うまでもありません。
すべてを 1 つのヘッダー ファイルに収めることができないのはなぜですか?
すべてを単一のヘッダーに詰め込むと、そのヘッダーを変更するたびに、そのヘッダーを含むすべてのファイルが再コンパイルされます。あなたの場合、それはプロジェクト全体になります。
小さなファイルがたくさんあり、絶対に必要な場合にのみ含めると、プロジェクトの管理が容易になります。
ヘッダーは整理するために存在します。
非常に単純なプロジェクトの場合、1 つのヘッダー ファイルで十分です。ヘッダーをまったく使用せず、すべてを 1 つのファイルに書き込むこともできます。
しかし、並列システム、複数のコンテキストで使用されるクラス、または単純に OpenSSL や MySQL などのサードパーティ ライブラリを使用する、より大規模なプロジェクトに成長すると、このすべてのコードを 1 つのファイルに何百万ものコードを配置するだけではうまくいきません。コードの行数。
また、プロジェクトに必要なすべてのヘッダーを 1 つの "common.h" に配置し#include
てから、すべての.cpp
.
その答えは、それぞれ.cpp
が個別にコンパイルされるためです。したがって、それぞれのヘッダーを.cpp
必要なものだけに制限すると、結果の.obj
サイズとコンパイル時間の両方が減少します。
また、ヘッダーに変更を加えるたびに、関連するものだけを再コンパイルするのではなく、プロジェクト全体を再コンパイルする必要があります.cpp
。
すでに投稿されているすべての回答に加えて、C++ には、使用したものに対して料金を支払う、または逆に、使用しないものに対して料金を支払わないという哲学があることを考慮したい場合があります。
#include
アプリケーションがたとえば複素数を必要とする場合は、この機能に進みます。私がそれを必要としない場合、私のコードがそのような概念が存在することを認識しなければならない理由はまったくありません。
特定の種類のアプリケーションに対して同じヘッダー ファイルを何度もインクルードし続けていると判断した場合、インクルードをインクルードするマスター ヘッダー ファイルを作成します#include
。
例えば:
// @file project.hpp
// @brief provides all the functionality required by `project`
#include<library1.hpp>
#include<library2.hpp>
#include<library3.hpp>
// any type definitions go below this line
そして、私のプロジェクトで
// @file project.cpp
// @brief Implements `project`
#include<project.hpp>
// go ahead and implement project
などの他のライブラリはboost
通常、ライブラリの使用を簡素化するために、上記のような「マスター」インクルード ファイルを提供します。