2

模板类是许多可能的类,所以我问我:预处理器指令

#ifndef MY_CLASS
#define MY_CLASS

template<typename T>
class My_Class
{};

#endif

是必需品吗?

4

2 回答 2

3

包含保护可防止重复包含同一文件。您需要它们来阻止包含以下非法定义的翻译单元:

template <typename T> class My_Class { };
template <typename T> class My_Class { };

// Error: redefinition of ‘class Foo<T>’

重复包含很容易发生。例如,考虑一个包含Aand的情况B,并且由于某些未记录的原因A已经包含。B您可能无权B从显式包含中省略,但也不应A要求不包含它。只有使用包含守卫(或某种等效机制)才能使这样的文件结构成为可能。

简而言之:您可以有重复的声明,但在一个翻译单元中只能有一个定义。

反例:以下合法的:

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() {}

于 2012-08-18T14:15:15.020 回答
0

宏可能被用作“包含守卫”,如果标题碰巧被包含多次,可以防止多次声明错误。所以是的,它们对于其他所有内容都是“必要的”:如果您可以确定标题不会被多次包含,您可以将它们排除在外,但另一方面,它们并没有真正增加文件大小或编译时间。

于 2012-08-18T14:13:06.470 回答