C++ プログラムはファイルに記述されています。この記事を読んでください。

「別のファイルに書き込む」という用語をよく聞きます

それで、これは何ですか?
別ファイル記述(モジュールプログラミング)の意味は、プログラムのコードを複数のファイルに格納すること、つまり、異なる機能モジュールを異なるファイルに配置し、それらのモジュール間に必要な接続を確立することです。お互いに機能全体を完了します。
ここに画像の説明を挿入します

そして、その利点は何ですか?

1.メリット

1. 保守が容易: プログラムを別のファイルに記述することでモジュール管理が容易になります。各モジュールは比較的独立した機能と責任を持ちます。1 つのモジュールを変更しても他のモジュールの機能に影響を与えないため、プログラムの保守と更新が容易になります。

2. コードの再利用: モジュール式プログラミングにより、複数のプログラムが同じモジュールを共有してコードの冗長性と重複を減らすことができます。

3. 可読性が高い: プログラムを別々のファイルに記述することで可読性が向上し、各モジュールの機能と役割が明確で理解しやすくなります。

4. 開発効率の向上: プログラマは複数のモジュールを同時に開発してプログラム全体を実装できるため、開発効率が向上します。

5. 便利なテスト: モジュール形式のプログラムを個別にテストできるため、プログラムの問題の特定と解決が容易になります。

6. プログラムの安定性の向上: モジュール式プログラミングにより、プログラム エラーの可能性が減り、プログラムの安定性と信頼性が向上します。1. 保守が容易: プログラムを別々のファイルに記述することでモジュール管理が容易になります。各モジュールは比較的独立した機能と責任を持ちます。1 つのモジュールを変更しても他のモジュールの機能に影響を与えないため、プログラムの保守と更新が容易になります。

1. ファイルの種類

C++ プログラムは通常、次の 3 種類のファイルに分かれています。

ヘッダー ファイル (.h) : cpp ファイルに含めるさまざまな宣言が含まれています。
モジュール ファイル (.cpp) : 関数モジュールとも呼ばれる関数定義が含まれています。
メイン プログラム ファイル (.cpp) : main() 関数を含むファイル。プログラム エントリとして機能し、モジュール ファイルに実装されたメソッドを呼び出します。

1.1.ヘッダファイル

ヘッダー ファイルは複数のソース ファイルに接続するために存在し、ソース ファイル間のインターフェイスになります。C 言語と同様に、C++ では最初に宣言してから使用する必要がありますが、コンパイル中に単一のファイルにコンパイルされます。ヘッダー ファイルのない例を次に示します。

// main.cpp
void fun();     // 必须先声明,否则会出错

int main(){
    
    
fun();       // 调用fun函数
}

// fun.cpp
#include <iostream>
void fun(){
    
    
std::cout << "This is fun." << std::endl;
}

コマンド「g++ main.cpp fun.cpp」を使用してこれら 2 つのファイルをコンパイルすると、正常に実行できるようになります。理解する必要があるのは、C++ のコンパイル プロセスでは、各ファイルを個別にコンパイルし、コンパイルされた複数のファイルをリンクによって実行可能プログラムに結合することです。コンパイル中には関数宣言のみがチェックされ、ファイルが以前に関数を宣言していれば、正常にコンパイルされます。関数定義はリンク段階でチェックされ、リンクには複数のファイルが関係します。上記の例では、コンパイルする前に main.cpp で関数 fun() を宣言する必要があります。この関数は main.cpp には定義されていませんが、リンク時に fun.cpp で関数が定義されていることがわかり、プログラムは次のようになります。正しい。

ただし、毎回他のファイルから関数を手動で宣言するのは面倒で、エラーが発生しやすくなります。そこで、宣言文をファイルにまとめて「ヘッダーファイル」と呼びます。特定の関数を使用する必要がある場合は、その関数が配置されているヘッダー ファイルをインクルードします。ヘッダー ファイルの内容はコンパイル前にソース ファイルに貼り付けられるため、コンパイル中に正常に通過できます。次に、ヘッダー ファイルを使用した例を見てみましょう。

// main.cpp
#include "header.h"

int main(){
    
    
fun();
}

// header.h
#ifndef HEADER_H
#define HEADER_H

void fun();

#endif

// fun.cpp
#include <iostream>
void fun(){
    
    
std::cout << "This is fun." << std::endl;
}

ヘッダー ファイルの内容は通常、依存関係の問題による複数のインクルードを防ぐために、条件付きコンパイルで準備されたステートメント (上記の例など) で囲まれています。

ヘッダー ファイルの役割は理解できたので、ヘッダー ファイルにはどのようなコンテンツを配置する必要があるでしょうか。ヘッダーファイルに入れてはいけないものは何ですか? 非常に簡単で、この部分を関連する各 cpp ファイルにコピーする必要がある場合はヘッダー ファイルに記述しますが、複数の cpp ファイルにコピーするとリンク エラーが発生する可能性がある場合は、ヘッダー ファイルには記述しないでください。具体的には:

関数宣言: 前述したように、明らかにヘッダー ファイルに配置する必要があります。
クラス定義、構造体定義:関数定義のロジックを想像してみると、ヘッダファイルには置けそうにありません。ただし、実際にはヘッダー ファイルに配置する必要があります。まず、コンパイラーがオブジェクトにスペースを割り当てる方法を認識できるように、各 cpp ファイルに定義が必要です。第 2 に、型定義はメモリ上のスペースを割り当てません。
テンプレート関数: コンパイラは、関数テンプレートに基づいてコンパイル時に対応する関数をインスタンス化する必要があるため、ヘッダー ファイルに配置する必要があります。
インライン関数: 呼び出し場所はコンパイル時に挿入されるため、ヘッダー ファイルにも配置する必要があります。
関数の定義: いいえ! C++ では、プログラム内で同じシグネチャを持つ関数は 1 つの定義のみを持つことができると規定しています。関数定義がヘッダー ファイルに配置され、複数の cpp ファイルにヘッダー ファイルが含まれている場合、リンク中に複数の定義バージョンが表示され、リンク エラーが発生します。
変数の定義: いいえ! 上記と同様に、複数のファイルにインクルードされている場合、同じ変数を複数回定義してリンクエラーが発生するという問題が発生します。ただし、静的変数と外部変数は、マクロ定義の定数と同様に、リンク エラーを引き起こさないため、複数のファイルに出現できます。

1.2. cppソースファイル

ヘッダー ファイルの内容を抽出した後、残りの内容を cpp ファイルに配置できます。cpp ファイルには、対応するヘッダー ファイルをインクルードする必要があること以外に変更はありません。

これらはすべて cpp ファイルですが、モジュール ファイルおよびメイン プログラム ファイルとして扱う必要があります。実際の開発では、モジュールファイルや本体プログラムファイルの機能提供者と利用者が異なる人が開発することが一般的です。

2. 複数ファイルのコンパイル

Windowsの統合開発環境を利用する場合、「ビルド」ボタンをクリックするだけでワンクリックで完了しますが、このプロセスについての理解が不足している可能性があります。したがって、Linux を例として、最も単純な複数ファイルのコンパイル コマンドを紹介します。

g++ main.cpp fun.cpp -o out # 列举所有要编译的文件

最初に .o ファイルに個別にコンパイルしてからリンクすることもできます。

g++ -c main.cpp -o main.o
g++ -c fun.cpp -o fun.o
g++ main.o fun.o -o out

2 番目のアプローチは混乱を引き起こす可能性があります。なぜこれほど問題が発生するのでしょうか? ただし、このアプローチには、モジュールのコンパイルの更新という利点が 1 つあります。プロジェクト全体を再コンパイルすることなく、変更したファイルのみをコンパイルして他のファイルとリンクする必要があります。

実際のプロジェクトではプロジェクトファイルの数が非常に多くなる場合があり、どの方法を使ってもファイルを一つ一つリストアップする必要があり現実的ではありません。統合開発環境ツールでは当然この問題は発生しません。ただし、Linux では、プロジェクト管理と自動コンパイルに Makefile を使用することもできます。もちろん、これも学ぶべき側面です。

おすすめ

転載: blog.csdn.net/aliyonghang/article/details/132548330