30行目: 30行目:


== 条件付きインクルード ==
== 条件付きインクルード ==
条件付きインクルードは、C++のプリプロセッサ機能の1つで、特定の条件下でのみヘッダファイルをインクルードする方法である。<br>
これは、コードの重複インクルードを防いで、コンパイル時間を短縮、プラットフォーム依存の問題を解決するのに役立つ。<br>
<br>
==== #ifdef / #ifndef / #elif / #endif ====
主に使用されるのは、<code>#ifndef</code>と<code>#define</code>の組み合わせである。<br>
これは、インクルードガードと呼ばれる技術である。<br>
<br>
以下の例では、ヘッダファイルが複数回インクルードされた場合でも、実際には1度のみ処理されている。<br>
<syntaxhighlight lang="c++">
#ifndef SOME_UNIQUE_NAME_H
#define SOME_UNIQUE_NAME_H
// ヘッダファイルの内容
#endif
</syntaxhighlight>
<br>
また、<code>#if</code>と<code>#elif</code>を使用して、より複雑な条件分岐を作成することもできる。<br>
以下の例では、コンパイル環境に応じて適切なヘッダファイルをインクルードしている。<br>
<syntaxhighlight lang="c++">
#if defined(_WIN32)
    #include <windows.h>
#elif defined(__APPLE__)
    #include <MacOS.h>
#else
    #include <unistd.h>
#endif
</syntaxhighlight>
<br>
条件付きインクルードは、以下に示すような状況で特に有効である。<br>
* 循環依存性の回避
*: 複数のヘッダファイルが相互に依存している場合
* プラットフォーム固有のコード管理
*: 異なるOSやハードウェア向けのコードを1つのプロジェクトで管理する場合
* コンパイル時の最適化
*: 特定の機能が必要な場合にのみ、関連するヘッダファイルをインクルードすることでコンパイル時間を短縮できる。
<br>
<u>※注意</u><br>
<u>ただし、過度に複雑な条件付きインクルードはコードの可読性を低下させ、保守を困難にする可能性がある。</u><br>
<u>そのため、可能な限りシンプルに保ち、必要な場合にのみ使用することが推奨される。</u><br>
<br>
<u>また、モダンなC++では、モジュールシステムの導入により、従来のヘッダファイルとインクルードガードの必要性が減少しつつある。</u><br>
<u>しかし、レガシーコードや特定の状況では、条件付きインクルードは依然として重要な役割を果たしている。</u><br>
<br>
==== __has_include ====
条件付きインクルードを行うには、<code>__has_include</code>プリプロセッサディレクティブを使用する必要がある。<br>
条件付きインクルードを行うには、<code>__has_include</code>プリプロセッサディレクティブを使用する必要がある。<br>
ただし、<code>__has_include</code>は、C++ 17以降で利用可能な機能である。<br>
ただし、<code>__has_include</code>は、C++ 17以降で利用可能な機能である。<br>