模板类是可能类的众多,所以我问我:预处理器指令
#ifndef MY_CLASS
#define MY_CLASS
template<typename T>
class My_Class
{};
#endif
是必需品吗?
答案 0 :(得分:3)
包含防护措施可防止重复包含同一文件。您需要它们来防止包含以下定义的翻译单元,这些定义是非法的:
template <typename T> class My_Class { };
template <typename T> class My_Class { };
// Error: redefinition of ‘class Foo<T>’
重复包含很容易发生。例如,考虑一个案例,其中包含A
和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() {}
。只有使用包含保护(或某种等效机制)才能使这样的文件结构成为可能。
简而言之:您可以在一个翻译单元中重复声明,但只能有一个定义。
反例:以下 合法:
{{1}}
答案 1 :(得分:0)
这些宏可能被用作“包含保护”,如果多次包含标题,则可以防止多次声明错误。所以是的,它们与其他所有内容一样“必要”:如果你可以确定标题不会被多次包含,你可以将它们排除在外,但另一方面,它们并没有真正添加到文件大小或编译时间。