gpt4 book ai didi

c++ - 模板 (.tpp) 文件包括 guard

转载 作者:IT老高 更新时间:2023-10-28 23:15:27 28 4
gpt4 key购买 nike

在编写模板类时,我喜欢将实现移动到不同的文件(myclass.tpp)中,并将其包含在主标题的底部(myclass.hpp)。

我的问题是:我需要在 .tpp 文件中包含守卫,还是在 .hpp 文件中包含它们就足够了?

示例代码:

myclass.hpp

#ifndef MYCLASS_HPP
#define MYCLASS_HPP

template<typename T>
class MyClass
{
public:
T foo(T obj);
};

//include template implemetation
#include "myclass.tpp"

#endif

myclass.tpp

#ifndef MYCLASS_TPP //needed?
#define MYCLASS_TPP //needed?

template<typename T>
T MyClass<T>::foo(T obj)
{
return obj;
}

#endif //needed?

最佳答案

Do I need include guards in the .tpp file or is it sufficient to have them in the .hpp file?

从不需要包含 guard :它们非常有用、便宜、无干扰且令人期待。所以是的,您应该使用 header 保护来保护这两个文件:

  • 非常有用:它们允许您声明来自多个文件的依赖项,而无需跟踪已包含哪些文件。
  • 便宜:这只是一些预编译 token 。
  • 无中断:它们非常适合 #include 的大多数用例(我有个同事不知道怎么写宏,所以他 #include d 实现文件facepalm)。
  • 预期:开发人员知道他们是什么,几乎没有注意到他们;相反,缺少包含守卫的头文件会唤醒我们并添加到全局 wtf/line 计数器。

我借此机会强调 StoryTeller 的评论:

I'd go a step further and add a descriptive #error directive if the hpp guard is not defined. Just to offer a little protection from people including the tpp first.

这将转化为:

#ifndef MYCLASS_TPP
#define MYCLASS_TPP

#ifndef MYCLASS_HPP
#error __FILE__ should only be included from myclass.hpp.
#endif // MYCLASS_HPP

template<typename T>
T MyClass<T>::foo(T obj)
{
return obj;
}

#endif // MYCLASS_TPP

注意:如果翻译单元在前 #include <myclass.hpp>然后 #include <myclass.tpp> ,没有错误被触发,一切都很好。

关于c++ - 模板 (.tpp) 文件包括 guard ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54362798/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com