#17 C++で学ぶモジュールとパッケージの基本

C++のファイル整理は、伝統的な「ヘッダーファイル」という仕組みに加え、比較的新しい「名前空間」や「モジュール」も使われます。この記事では、C++におけるファイル分割の基本を解説します。

ヘッダーファイルと実装ファイル

C++では、関数の宣言を.hファイルに、中身を.cppファイルに分けて書くのが伝統的な方法です。

// utils.h
#pragma once
void greet(std::string name);
// utils.cpp
#include "utils.h"
#include <iostream>

void greet(std::string name) {
    std::cout << "こんにちは、" << name << "さん" << std::endl;
}
// main.cpp
#include "utils.h"

int main() {
    greet("太郎");
}

#pragma onceは、同じヘッダーファイルが誤って複数回読み込まれるのを防ぐおまじないです。宣言(何ができるか)と実装(具体的にどう動くか)を分けておくことで、他のファイルからは.hだけを見れば使い方が分かるようになります。

namespaceという仕組み

C#と同じく、C++にもnamespaceという仕組みがあり、名前の衝突を防ぐために使われます。

namespace utils {
    void greet(std::string name) {
        std::cout << "こんにちは、" << name << "さん" << std::endl;
    }
}

utils::greet("太郎");

別々のライブラリで同じ名前の関数(greetなど)が定義されていても、namespaceで囲んでおけばutils::greetのように区別して呼び出せるため、名前の衝突を避けられます。

C++ならではの注意点

比較的新しいC++では「モジュール」という、ヘッダーファイルに代わる新しい仕組みも導入され始めています。モジュールは#includeによるヘッダーの重複読み込みや、コンパイル時間が長くなる問題を解消することを目的としていますが、コンパイラやビルドツールによって対応状況にばらつきがあり、まだ広く普及しているとは言えません。学習を始めたばかりの段階では、まずヘッダーファイルと.cppファイルを分ける伝統的な方法から慣れていくのがおすすめです。

まとめ

C++のファイル分割はヘッダーファイル(.h)と実装ファイル(.cpp)に分ける伝統的な方法が基本で、namespaceで名前の衝突を防ぎます。新しい「モジュール」の存在も頭の片隅に置いておきましょう。


本ページはプロモーションを含みます。

参考書籍(PR)

C++をもっと学びたい方には「新・明解C++入門編」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本