模板类是许多可能的类,所以我问我:预处理器指令
#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
and的情况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() {}
宏可能被用作“包含守卫”,如果标题碰巧被包含多次,可以防止多次声明错误。所以是的,它们对于其他所有内容都是“必要的”:如果您可以确定标题不会被多次包含,您可以将它们排除在外,但另一方面,它们并没有真正增加文件大小或编译时间。