模板类和预处理程序指令

时间:2012-08-18 14:09:18

标签: c++ templates c-preprocessor preprocessor-directive

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

#ifndef MY_CLASS
#define MY_CLASS

template<typename T>
class My_Class
{};

#endif

是必需品吗?

2 个答案:

答案 0 :(得分:3)

包含防护措施可防止重复包含同一文件。您需要它们来防止包含以下定义的翻译单元,这些定义是非法的:

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

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

重复包含很容易发生。例如,考虑一个案例,其中包含AB,而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)

这些宏可能被用作“包含保护”,如果多次包含标题,则可以防止多次声明错误。所以是的,它们与其他所有内容一样“必要”:如果你可以确定标题不会被多次包含,你可以将它们排除在外,但另一方面,它们并没有真正添加到文件大小或编译时间。