Почему шаблоны Xcode имеют #imports, которые дублируют Prefix.pch? - PullRequest
17 голосов
/ 24 июня 2011

При изучении программирования на iPhone каждый шаблон Xcode, который я видел, содержит файл AppName-Prefix.pch со следующим содержимым:

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

Насколько я понимаю, содержимое этого файла имеет префикс перед каждым изфайлы исходного кода перед компиляцией.Тем не менее, каждый из остальных файлов также импортирует UIKit, что кажется излишним.Например, main.m начинается ...

#import <UIKit/UIKit.h>

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

Какао-приложения в Mac OS X делают то же самое, импортируя Cocoa.h как в файл префикса, так и в файлы заголовков.

Почему оба?Я удалил директивы #import из всех исходных файлов, кроме файла префикса, и он скомпилирован и работает правильно.

Ответы [ 2 ]

14 голосов
/ 24 июня 2011

Насколько я понимаю, содержимое этого файла имеет префикс перед каждым файлом исходного кода перед компиляцией

Это в принципе правильно, но вы должны понимать тонкие моменты: каждая компиляция из Xcode в конечном итоге сводится к вызову gcc или clang. Что делает XCode, так это сначала компилирует файл X.pch:

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

и затем, когда отдельный исходный файл (скажем, a.m) скомпилирован, он выдает

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

, который загружает файл pch, вызывая использование предварительно скомпилированного заголовка. Таким образом, с точки зрения компилятора , на самом деле содержимое файла pch не имеет префикса автоматически. Скорее, Xcode добавляет префикс скомпилированного заголовка к файлу, когда он вызывает компилятор.

Будущая версия XCode может просто перестать это делать. Поэтому лучше хранить #import s в ваших .m или .h файлах.

Вы также можете думать об этом так: использование файла pch - это то, что Xcode делает для нас за кулисами, чтобы ускорить процесс компиляции. Поэтому мы не должны писать коды так, как это существенно зависит от них, например, не импортировать файл UIKit.h из наших файлов .m / .h.

(Кроме того, мне кажется, что синтаксическая раскраска XCode4 запутается, если вы неправильно импортируете соответствующие заголовочные файлы из файлов .h и .m.)

3 голосов
/ 24 июня 2011

Почему у обоих?

Лучше безопасно, чем потом сожалеть. Предварительно скомпилированные заголовки можно отключить, и поскольку #import ничего не импортирует дважды, накладные расходы незначительны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...