テンプレートクラスは多数の可能なクラスであるため、私は私に尋ねていました:プリプロセッサディレクティブ
#ifndef MY_CLASS
#define MY_CLASS
template<typename T>
class My_Class
{};
#endif
必要ですか?
テンプレートクラスは多数の可能なクラスであるため、私は私に尋ねていました:プリプロセッサディレクティブ
#ifndef MY_CLASS
#define MY_CLASS
template<typename T>
class My_Class
{};
#endif
必要ですか?
インクルードガードは、同じファイルが繰り返しインクルードされるのを防ぎます。違法である次の定義を含む翻訳単位を防ぐためにそれらが必要です。
template <typename T> class My_Class { };
template <typename T> class My_Class { };
// Error: redefinition of ‘class Foo<T>’
リピートインクルージョンは非常に簡単に発生します。たとえば、とを含め、文書化されていない理由ですでに含めA
ている場合を考えてみます。明示的なインクルードから除外する資格がない場合もありますが、インクルードしないように要求することもできません。インクルードガード(または同等のメカニズム)を使用することによってのみ、そのようなファイル構造を可能にすることができます。B
A
B
B
A
簡単に言うと、宣言を繰り返すことはできますが、 1つの翻訳単位内に定義を1つだけ含めることができます。
反例:以下は合法です:
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo { };
int main() {}
マクロはおそらく「インクルードガード」として使用され、ヘッダーが複数回インクルードされた場合の複数宣言エラーを防ぎます。そうです、それらは他のすべてと同様に「必要に応じて」あります。ヘッダーが複数回含まれないことを確認できる場合は、それらを除外できますが、一方で、実際にはファイルサイズに追加されていません。またはコンパイル時間。