在F.B.爲期半年的C++課程中, Brokken(The C++ Annotations的作者)介紹了我們使用所謂的實現頭文件。我知道這是弗蘭克的慣例,但我從來沒有在其他地方看過它。因此,我會解釋一下這個概念,我很好奇別人對此的看法。是否有人熟悉「實現/內部頭文件」(* .ih)?
這個想法是,你只需將所有的#include
指令放在一個文件中,你的類成員實現的實現(假設你沒有編寫類內定義),那麼.ih實現頭文件和而不是每個源文件中的#include
這個文件。替代方案是
1)#include
類頭中的所有內容或
2)#include
所有頭文件都在每個源文件中分開。
到兩個備選方案的缺點是顯而易見的:
1A)你必須重新編譯所有S「添加任何需要一些額外的#include
後,荷蘭國際集團這頭」來源#include
。
1b)你的頭文件,應該是你班上的一個清晰的界面,被一大堆指令所污染,用戶不知道它們用於什麼,他也不在乎。 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'只是簡單的複製粘貼。至少如果我沒有在你的問題中遺漏任何東西。 – Griwes
不,它不會改變任何東西,但增加代碼可讀性。這將永遠是一個私人問題,但我更喜歡一個#包括「blabla.ih」,其中6個,特別是如果這6個重複在你的很多來源。 – JorenHeit
廢話,每個實現文件將有不同的必需的標題 - 最有可能的。而且,如果將它們包含在另一層級的間接內容中,它會導致可讀性而不是提高它,因爲讀取文件的人必須查看另一個文件才能找出它包含的內容。 – Griwes