Objective-C 中的#import 和#include 有什么区别?在某些情况下您应该使用其中一个而不是另一个?是否已弃用?
我正在阅读以下教程:http://www.otierney.net/objective-c.html#preamble它关于#import 和#include 的段落似乎自相矛盾,或者至少不清楚。
最佳答案
似乎有很多关于预处理器的混淆。
编译器在看到 #include
时会做什么,它会用包含文件的内容替换该行,不问任何问题。
因此,如果您有一个包含以下内容的文件 a.h
:
typedef int my_number;
和一个文件 b.c
包含以下内容:
#include "a.h"
#include "a.h"
文件b.c
会在编译前被预处理器翻译成
typedef int my_number;
typedef int my_number;
这将导致编译器错误,因为类型 my_number
被定义了两次。即使定义相同,C 语言也不允许这样做。
由于一个 header 经常在多个地方使用包含保护通常在 C 中使用。看起来像这样:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
b.c
文件在预处理后仍然会包含两次 header 的全部内容。但是第二个实例将被忽略,因为宏 _a_h_included_
已经被定义了。
这非常有效,但有两个缺点。首先必须编写包含保护,并且每个 header 中的宏名称必须不同。其次,编译器仍然需要查找头文件并尽可能多地读取它。
Objective-C 有 #import
预处理指令(它也可以用于带有一些编译器和选项的 C 和 C++ 代码)。这与 #include
几乎相同,但它还在内部记录了已包含的文件。 #import
行仅在第一次遇到时被命名文件的内容替换。之后每次都会被忽略。
关于objective-c - Objective-C 中的#import 和#include 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/439662/
相关文章:
objective-c - 将 block 内的变量分配给 block 外的变量
objective-c - 如何按字母顺序对 NSArray 进行排序?
iphone - 如何使用返回键关闭 UITextView 的键盘?
objective-c - 如果您使用 CocoaPods,您的 .gitignore 会包含什么内
objective-c - 如何将 NSMutableArray 转换为 NSArray?
objective-c - 以编程方式设置 UIButton 标题 UILabel 字体大小