在学习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应用程序执行相同的操作,在前缀文件和头文件中导入Cocoa.h。
为什么两者兼而有之?我从除了前缀文件之外的所有源文件中删除了#import
指令,并且编译并正确运行。
答案 0 :(得分:14)
我的理解是这个文件的内容在编译之前以每个源代码文件为前缀
这基本上是正确的,但你需要理解微妙的要点: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
文件。
(另外,在我看来,如果你没有从.h
和.m
文件中正确导入适当的头文件,XCode4的语法着色会变得混乱。)
答案 1 :(得分:3)
为什么两者都有?
比抱歉更安全。可以禁用预编译头文件,并且由于#import不会导入任何两次,因此开销可以忽略不计。