「このソース、#includeが書かれていないのにちゃんと動いている…?」
そんな不思議なコードを見たことはありませんか。
実はそういったコードには強制インクルードという機能が隠れているのです。
強制インクルードを使うと、プロジェクト全体で共通のヘッダを自動的に適用できるため、ソースコードを簡潔に保ちつつ、漏れなく必要な定義を読み込ませることができます。
本記事ではVisualStudio2022で強制インクルードを行う方法を紹介し、プリコンパイル済みヘッダ (PCH)との相性や注意点についても解説していきます。
前提知識
-
VisualStudio2022の基本の使い方を知っている -
C++の基礎文法を理解している
想定環境
VisualStudio2022
強制インクルードとは
強制インクルードとは、C/C++のコンパイラに対して「すべてのソースファイルの先頭に必ず特定のヘッダを読み込ませる」ための仕組みです。
通常は各ソースファイルで#includeを書く必要がありますが、強制インクルードを使うと 明示的に書かなくても自動的にインクルードされるため、プロジェクト全体で共通のヘッダを漏れなく適用できます。
セットアップ方法
上部GUIからプロジェクト->プロパティをクリックしてプロパティウィンドウを開きます。

ウィンドウ左から構成プロパティ->C/C++->詳細設定を開き、ウィンドウ右側から必ず使用されるインクルードファイルという場所に、強制インクルードしたいファイルの名前を追加します(本記事ではまずはテストでiostreamを追加してみます)。

追加したら、適用をクリックして変更を適用してください。

これでセットアップが完了したので、簡単に挙動を確認します。
iostreamを強制インクルードしてハローワールドを出力するサンプル
//------------------------------------------------------
//! @file main.cpp
//! @brief 強制コンパイルのサンプルプログラム
//! @author つきの
//------------------------------------------------------
int main() {
std::cout << "Hello, World!" << std::endl;
}
Hello, World!
出力することに成功しました。
強制インクルードの設定を行うことによって、ソースファイル内でiostreamを#includeしなくても、コンパイルが行えるようになりました。
PCHとの相性
強制インクルードは単体でも便利ですが、乱用すると依存関係が肥大化し、ビルド時間や保守性に悪影響があります。
プリコンパイル済みヘッダ (PCH)と組み合わせることで、「全ソースに共通ヘッダを必ず適用しつつ、コンパイル時間を短縮する」という二重の効果を得られます。
多くのファイルで使用するヘッダーに関してはPCHにまとめて、強制インクルードではPCHのみを指定する方法を推奨したいです。
PCHを強制インクルードしてみる
pch.hを強制インクルードしてコンパイルしてみます。
プリコンパイルについては先ほどの記事内で詳しく触れているため、そちらをご参照ください。
//------------------------------------------------------------
//! @file pch.h
//! @brief プリコンパイル済みヘッダーファイル
//! @author つきの
//------------------------------------------------------------
#pragma once
#include <iostream> // 標準入出力
//---------------------------------------------
//! @file pch.cpp
//! @brief プリコンパイル済みヘッダーファイルを生成するためのソースファイル
//! @author つきの
//---------------------------------------------
#include "pch.h"
//---------------------------------------------
//! @file main.cpp
//! @brief メインソースファイル
//! @author つきの
//---------------------------------------------
//エントリポイント
int main() {
//ハローワールドを表示
std::cout << "Hello, World!" << std::endl;
return 0;
}
Hello, World!
こちらの方法であれば、今後ファイル数が増えたとしてもビルド時間が肥大化するといった問題をなくしつつ、ソースファイルでの記述を簡潔に保つことが出来ます。
総括
-
強制インクルードは全ソースファイルに共通のヘッダを強制的に適用できる仕組み -
Visual Studio2022ではプロパティ設定から簡単に強制インクルードを設定することが出来る - 簡潔な記述ができるようになる反面で、乱用はビルド時間や保守性に悪影響がある
-
プリコンパイル済みヘッダ (PCH)と組み合わせることで、共通ヘッダを必ず適用しつつ、コンパイル時間を短縮できる
