2014-06-06 423 views
1

從面向對象的角度來看(大多數是C++和Objective C),包含所有其他頭文件的單頭文件?

它是一個良好的編程習慣,包括在項目中使用到一個單一的(.h)中所有的頭文件,並簡單地包括在所有這個頭文件實現文件以及「標題衛士」和「#pragma once」(或#import)的(正確)使用情況?

這可能是什麼負面影響?

+1

_ '包含所有其他頭文件的單個頭文件?'_ ...可能不是一個好主意!在這裏檢查:http://stackoverflow.com/questions/24080478/in-mfc-c-taking-too-much-time-to-build#comment37136245_24080478 –

+3

保持它限於不太可能改變的文件。 – CrimsonChris

+0

這與OOP沒有多大關係...... –

回答

5

這是一個非常糟糕的主意。它會徹底拖慢你的編譯過程。如果您需要在每個文件或大多數文件中訪問多個標題,請查看預編譯的頭文件(xCode中的.pch)。這是做到這一點的正確方法。

擴展答案:製作課程時,您希望在.h文件中包含儘可能少的標題。在.m中使用它們會更好,因爲它們不會影響其他包含頭的類的編譯時間。當您需要事先知道它的大小時,您只需要在.h中完整定義一個類型。但你總是知道一個指針的大小,所以前置聲明是不夠的:

MyObject.h

#import "MyStruct.h" 

@class Foo; //Forward declaration of Foo. 

@class MyObject 
{ 
    Foo *foo; //No problem, you know the size. You can import Foo.h in MyObject.m 
    MyStruct struct; //Oops, this is not a pointer. You need to import it's definition right here. 
} 
@end 

MyObject.m

#import "MyObject.h" 
#import "Foo.h" 

...

- (void)doStuffWithFoo 
{ 
    [foo doStuff]; //If you don't import Foo.h, this will throw a compiler error. 
} 
+0

感謝您的深刻回覆。 只是爲了澄清 - 我在這裏閱讀(http://stackoverflow.com/questions/439662/what-is-the-difference-between-import-and-include-in-objective-c)that- 「第一次遇到#import行時,它只會替換爲指定文件的內容,每次之後它都會被忽略。 因此,對於不改變的頭文件,使用#import這種方法是否還會增加編譯時間? – Zaxter

+1

從內容不被追加的意義上來說,它被忽略了(就像它在使用#include時的計劃C中一樣,因此您需要使用include guard http://en.wikipedia.org/wiki/Include_guard)。但是你仍然在編譯過程中加入工作。相信我,它確實使大型代碼庫中的編譯速度慢得多。 –