objective-c - Objective-C 中的#import 和#include 有什么区

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 - 关闭键盘的简单方法?

ios - iPad 多任务支持需要这些方向

objective-c - 以编程方式设置 UIButton 标题 UILabel 字体大小

ios - 核心数据 : Quickest way to delete all instances

ios - 使用 iOS 确定设备(iPhone、iPod Touch)