從面向對象的角度來看(大多數是C++和Objective C),包含所有其他頭文件的單頭文件?
它是一個良好的編程習慣,包括在項目中使用到一個單一的(.h)中所有的頭文件,並簡單地包括在所有這個頭文件實現文件以及「標題衛士」和「#pragma once」(或#import)的(正確)使用情況?
這可能是什麼負面影響?
從面向對象的角度來看(大多數是C++和Objective C),包含所有其他頭文件的單頭文件?
它是一個良好的編程習慣,包括在項目中使用到一個單一的(.h)中所有的頭文件,並簡單地包括在所有這個頭文件實現文件以及「標題衛士」和「#pragma once」(或#import)的(正確)使用情況?
這可能是什麼負面影響?
這是一個非常糟糕的主意。它會徹底拖慢你的編譯過程。如果您需要在每個文件或大多數文件中訪問多個標題,請查看預編譯的頭文件(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.
}
感謝您的深刻回覆。 只是爲了澄清 - 我在這裏閱讀(http://stackoverflow.com/questions/439662/what-is-the-difference-between-import-and-include-in-objective-c)that- 「第一次遇到#import行時,它只會替換爲指定文件的內容,每次之後它都會被忽略。 因此,對於不改變的頭文件,使用#import這種方法是否還會增加編譯時間? – Zaxter
從內容不被追加的意義上來說,它被忽略了(就像它在使用#include時的計劃C中一樣,因此您需要使用include guard http://en.wikipedia.org/wiki/Include_guard)。但是你仍然在編譯過程中加入工作。相信我,它確實使大型代碼庫中的編譯速度慢得多。 –
_ '包含所有其他頭文件的單個頭文件?'_ ...可能不是一個好主意!在這裏檢查:http://stackoverflow.com/questions/24080478/in-mfc-c-taking-too-much-time-to-build#comment37136245_24080478 –
保持它限於不太可能改變的文件。 – CrimsonChris
這與OOP沒有多大關係...... –