Почему шаблоны Xcode имеют #imports, которые дублируют Prefix.pch?

При изучении программирования на 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 ответа

Решение

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

Это в основном правильно, но вы должны понимать тонкие моменты: каждая компиляция из 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в вашем .m или же .h файлы тоже.

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

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

Почему есть оба?

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

Другие вопросы по тегам