2011-06-24 13 views
16

Podczas nauki programowania iPhone, każdy Xcode szablon Widziałem zawiera plik programu NazwaAp-Prefix.pch o następującej treści:Dlaczego szablony Xcode mają #imports powielające Prefix.pch?

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
#endif 

moim rozumieniu jest to, że zawartość tego pliku są prefiksem do każdego z plików kodu źródłowego przed kompilacją. Jednak każdy z pozostałych plików również importuje UIKit, co wydaje się zbędne. Na przykład, main.m zaczyna ...

#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 
... 

aplikacji Cocoa w systemie Mac OS X to samo, importowanie Cocoa.h zarówno w pliku prefiks i plików nagłówkowych.

Dlaczego oba? Usunąłem dyrektywy #import ze wszystkich plików źródłowych oprócz pliku prefiksu, a następnie skompilowałem i działałem poprawnie.

Odpowiedz

12

moim rozumieniu jest to, że zawartość tego pliku są prefiksem do każdego z plików kodu źródłowego przed kompilacją

To w zasadzie prawidłowe, ale trzeba zrozumieć subtelne punkty: Każdy kompilacja z Xcode ostatecznie sprowadza się do wywołanie gcc lub clang. Co XCode robi to skompilować plik X.pch pierwszy:

clang -x X.pch -o X.pch.gch 

a gdy plik pojedynczego źródła (słownie a.m) jest kompilowany, wydaje

clang -include X.pch a.m -o a.o 

który ładuje plik pch, wywołując korzystania prekompilowanego nagłówka. Tak więc, z punktu widzenia kompilatora, tak naprawdę nie jest tak, że zawartość pliku pch jest automatycznie prefiksowana. Raczej Xcode prefiksuje prekompilowany nagłówek do pliku, gdy wywołuje kompilator.

Przyszła wersja XCode może po prostu przestać to robić. Więc lepiej jest przechowywać #import s również w plikach .m lub .h.

Można również pomyśleć o tym w następujący sposób: użycie pliku pch jest właśnie tym, co Xcode robi dla nas za kulisami, aby przyspieszyć proces kompilacji. Tak więc nie powinniśmy pisać kodów w sposób, w jaki zasadniczo od nich zależy, np. Nie importujemy pliku UIKit.h z naszych plików .m/.h.

(Także wydaje mi się, że XCode4 za kolorowanie składni pogubi jeśli nie importować odpowiednie pliki nagłówkowe poprawnie od .h i .m plików.)

3

Dlaczego oba?

Lepiej niż przepraszam. Prekompilowane nagłówki mogą być wyłączone, a ponieważ #import nie importuje niczego dwukrotnie, narzut jest nieistotny.

Powiązane problemy