目标中#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。
上一篇: What is the difference between #import and #include in Objective
下一篇: @class vs. #import