#import和#include在Objective-C中的区别是什么?在某些情况下你应该使用其中一个而不是另一个?一个被弃用了吗?

我正在阅读以下教程: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语言不允许这样做。

由于头文件经常在多个地方使用,包括保护通常在c中使用。

 #ifndef _a_h_included_
 #define _a_h_included_

 typedef int my_number;

 #endif

在经过预处理后,文件b.c仍然会在其中两次包含头文件的全部内容。但是第二个实例将被忽略,因为宏_a_h_included_已经定义了。

这工作得非常好,但有两个缺点。首先,必须编写包含守卫,并且每个头中的宏名称必须不同。其次,编译器仍然需要查找头文件,并在头文件被包含的时候经常读取它。

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

其他回答

#import指令作为#include的改进版本被添加到Objective-C中。然而,它是否有所改善仍是一个争论的问题。#import确保一个文件只被包含一次,这样就不会出现递归包含的问题。然而,大多数体面的头文件都会保护自己不受这种情况的影响,所以这并没有什么好处。

基本上,由您决定使用哪一种。我倾向于#import Objective-C内容(如类定义等)的头文件,#包含我需要的标准C内容。例如,我的一个源文件可能是这样的:

#import <Foundation/Foundation.h>

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

在可能的情况下,我在我的.h文件中有一个全局变量,导致了这个问题,我通过在它前面添加extern来解决它。

如果您熟悉c++和宏,那么

#import "Class.h" 

类似于

{
#pragma once

#include "class.h"
}

这意味着当你的应用程序运行时,你的类只会被加载一次。

#include用于从另一个文件中获取“东西”到使用#include的文件中。 例:

文件:main.cpp

#include "otherfile.h"

// some stuff here using otherfile.h objects,
// functions or classes declared inside

头保护用于每个头文件(*.h)的顶部,以防止包含同一个文件超过一次(如果发生这种情况,您将得到编译错误)。

文件:otherfile.h

#ifndef OTHERFILE
#define OTHERFILE

// declare functions, classes or objects here

#endif

即使你在代码中添加了#include "otherfile.h" n次,其中的this也不会被重新声明。

我同意杰森的观点。

我这样做被抓了个现行:

#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>通过使用#定义只包含<time.h>的一部分

#import <time.h>: 没有去。尽管<time.h>只包含了一部分,as 就#import而言,该文件现在已经完全包含在内。

底线:

C/ c++头文件通常包含其他包含文件的部分。 所以对于C/ c++头文件,使用#include。 对于objc/objc++头文件,使用#import。