Подтвердить что ты не робот

Почему у 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[]) {
...

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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