【发布时间】:2012-06-19 06:31:58
【问题描述】:
在 F.B. 的半年 C++ 课程中。 Brokken(The C++ Annotations 的作者),我们被教导使用所谓的实现头文件。我知道这是弗兰克的约定,但实际上我从未在其他任何地方见过它。因此,我将解释这个概念,我很好奇其他人对此有何看法。
这个想法是,您只需将类成员的实现所需的所有 #include 指令(假设您没有编写类内定义)放在一个文件中,即 .ih 实现头文件,而#include 这个文件在每个源文件中。替代品是
1) #include 类头文件中的所有内容或
2) #include 每个源文件中的所有头文件。
这两种选择的缺点都很明显:
1a) 在添加任何需要额外 #include's 的内容后,您必须重新编译所有源代码 #include'ing 这个头文件。
1b) 你的头文件,应该是你的类的清晰接口,被一大堆#include 指令污染,用户不知道它们的用途,他也不关心。
2a) 您必须在每个源文件中一次又一次地#include 相同的标题。
2b) 你的实现被所有这些#include 污染了,让它看起来有点乱。
要明确一点:
/* someclass.h(pp) */
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass
{
//some private data members
public:
SomeClass();
void sayHi() const;
// some more member functions
private:
// some private member functions
};
#endif
/* someclass.ih */
#include "someclass.h"
#include <iostream>
#include <vector>
using namespace std;
// namespace is now only used in my implementations, other people
// including my headers won't accidentally import the entire std namespace.
/* sayhi.cc */
#include "someclass.ih"
void SomeClass::sayHi() const
{
cout << "sayHi() says hi!\n";
}
现在,问题又是:有没有人听说过这样的约定?我说服任何人开始使用它了吗?我个人认为这是一个非常有用(甚至是显而易见)的约定,我有点惊讶我在其他任何地方都没有见过它。
【问题讨论】:
-
废话,因为您必须为每个班级管理一个额外的文件,这一切都不会改变,因为
#include只是简单的复制粘贴。至少如果我在您的问题中没有遗漏任何内容。 -
不,它不会改变任何东西,但会增加代码的可读性。这将永远是一个个人问题,但我更喜欢其中的 6 个小#include "blabla.ih",特别是如果这 6 个在您的很多资源中重复。
-
废话,每个实现文件都会有不同的所需标题 - 很可能。而且,当您在没有某种奇怪的另一层间接性的情况下包含它们时,它会扼杀而不是提高它的可读性,因为阅读该文件的人必须查看另一个文件以找出它真正包含的内容。跨度>
-
好吧,这显然不适合你!幸运的是,我并没有试图说服任何人或告诉任何人这样做;-) 只是对这个公约的其他观点感到好奇。
标签: c++ header include implementation internal