目标中#import和#include有什么区别

Objective-C中#import和#include之间有什么区别,并且有时候您应该使用另一个? 是否被弃用?

我正在阅读以下教程:http://www.otierney.net/objective-c.html#preamble及其关于#import和#include的段落似乎与本身矛盾,或者至少不清楚。


#import指令作为#include的改进版本添加到Objective-C中。 然而,它是否得到改善仍然是一个争论。 #import确保文件只包含一次,这样您就不会遇到递归包含的问题。 然而,多数体面的头文件无论如何都会保护自己,所以它并不是真正的好处。

基本上,由您决定要使用哪一个。 我倾向于为Objective-C的东西#import头文件(比如类定义等)和#include我需要的标准C东西。 例如,我的一个源文件可能如下所示:

#import <Foundation/Foundation.h>

#include <asl.h>
#include <mach/mach.h>

似乎对预处理器有很多困惑。

当编译器看到一个#include ,它会用所包含文件的内容替换该行,而不会提出任何问题。

所以如果你有这个内容的文件ah

typedef int my_number;

和一个文件bc与这个内容:

#include "a.h"
#include "a.h"

文件bc将在编译前由预处理器翻译为

typedef int my_number;
typedef int my_number;

这将导致编译器错误,因为my_number类型定义了两次。 即使定义相同,C语言也不允许这样做。

由于标题经常用于多个地方,因此通常在C中使用警卫。看起来像这样:

 #ifndef _a_h_included_
 #define _a_h_included_

 typedef int my_number;

 #endif

文件bc在进行预处理后仍然会在其中包含标题的全部内容两次。 但是第二个实例会被忽略,因为宏_a_h_included_已经被定义了。

这工作得很好,但有两个缺点。 首先必须写入包括卫兵,并且每个标题中的宏名称必须不同。 其次,编译器仍然需要查找头文件,并随时阅读它。

Objective-C具有#import预处理器指令(它也可以用于带有一些编译器和选项的C和C ++代码)。 这几乎与#include相同,但它也在内部注释了哪个文件已经包含在内。 #import行仅在第一次遇到时被指定文件的内容替换。 每次之后,它都被忽略。


我同意杰森。

我抓到了这样做:

#import <sys/time.h>  // to use gettimeofday() function
#import <time.h>      // to use time() function

对于GNU gcc,它一直抱怨time()函数没有被定义。

然后我将#import更改为#include,一切正常。

原因:

你#import <sys / time.h>:
<sys / time.h>通过使用#defines仅包含<time.h>的一部分

你#import <time.h>:
不行。 即使只有<time.h>的一部分已经包含在内,如
就#import而言,该文件现在已经完全包含在内。

底线:

C / C ++传统上标头包括的其他部分包括文件。
所以对于C / C ++头文件,使用#include。
对于objc / objc ++头文件,使用#import。

链接地址: http://www.djcxy.com/p/47375.html

上一篇: What is the difference between #import and #include in Objective

下一篇: @class vs. #import