関数内のように、グローバルスコープだけでなく、ファイル内の#include
どこでも使用できます(必要に応じて複数回)。確かに、醜く、良いスタイルではありませんが、可能であり、時には賢明です(含めるファイルによって異なります)。#include
一度だけだったら、それはうまくいきません。#include
結局のところ、ダムテキストの置換(カットアンドペースト)を行うだけであり、インクルードするすべてがヘッダーファイルである必要はありません。たとえば#include
、を初期化するための生データを含む自動生成データを含むファイルがありますstd::vector
。お気に入り
std::vector<int> data = {
#include "my_generated_data.txt"
}
また、「my_generated_data.txt」は、コンパイル中にビルドシステムによって生成されるものにします。
または多分私は怠惰/愚か/愚かでこれをファイルに入れます(非常に不自然な例):
const noexcept;
そして私はします
class foo {
void f1()
#include "stupid.file"
int f2(int)
#include "stupid.file"
};
もう1つの少し不自然な例は、多くの関数が名前空間で大量の型を使用する必要があるソースファイルですがusing namespace foo;
、グローバルな名前空間を他の多くのもので汚してしまうため、グローバルに言いたくないでしょう。あなたはしたくない。したがって、以下を含むファイル「foo」を作成します
using std::vector;
using std::array;
using std::rotate;
... You get the idea ...
そして、あなたはあなたのソースファイルでこれを行います
void f1() {
#include "foo"
}
void f2() {
}
void f3() {
#include "foo"
}
注:私はこのようなことをすることを推奨していません。しかし、それは可能であり、いくつかのコードベースで行われており、なぜそれが許可されるべきではないのかわかりません。それには用途があります。
また、含めるファイルが特定のマクロ(#define
s)の値に応じて異なる動作をする可能性もあります。したがって、最初に値を変更した後、ファイルを複数の場所に含めて、ソースファイルのさまざまな部分でさまざまな動作を取得することができます。
#ifdefs
れている場合があります。だからあなたは言うかもしれないが#define MODE_ONE 1
、その後#include "has-modes.h"
、その後#undef MODE_ONE
で#define MODE_TWO 1
と#include "has-modes.h"
再び。プリプロセッサはこれらの種類のものにとらわれず、場合によっては意味をなすことがあります。