C++中#include和#import的区别

112

#include#import在C++中有什么区别?


7
注意:vc++和gcc的#import与C++20的import不同。 - Louis Go
6个回答

94

在VC++中的导入: #import 用于类型库或.tlb(COM组件)。

类型库的内容会自动转换为C++类,大部分自动描述了COM接口,然后被包含到你的文件中。

#import 指令是微软作为C++语言扩展引入的。你可以在MSDN文章中了解它。

#import指令也与.NET / CLI相关。

在gcc中的导入: gcc中的导入与VC++中的导入不同。它是一种简单的方式,只能将头文件包含一次。(在VC++和GCC中,您也可以通过#pragma once完成这项工作)

#import指令在3.4版本中由gcc团队正式取消弃用,并且在所有支持它的以前版本的gcc中99%的时间内都可以正常工作。

包含: #include 主要用于头文件,但可以将其内容预先附加到当前文件中。#include是C++标准的一部分。你可以在MSDN文章中了解它。


7
你的MSDN链接已经过期了。感谢微软。 - Mark Ransom

71

#import 是一个仅适用于 COM 或 .NET 技术的 Microsoft 特有语句。

#include 是标准的 C/C++ 预处理器语句,用于在源代码文件中包含头文件(或偶尔其他源代码文件)。


10
这不是真的。在3.4版本中,#import指令被GCC团队正式取消弃用,并且在之前支持的所有先前版本中99%的时间内都可以正常工作。 - Brian R. Bondy
1
好奇心,我不知道那个。也许我应该说它是COM和.NET特定的事情。 - Head Geek
31
GCC支持的 #import 不是一种可移植的方式,只能包含一次头文件:<a href="http://gcc.gnu.org/onlinedocs/gcc-4.3.2/cpp/Obsolete-once_002donly-headers.html"/>。这与微软的 COM #import 没有任何关系。 - fizzer
5
GCC的#import实际上是一个Objective-C预处理器命令,它恰好可以在gcc和clang中与.c文件一起使用(除了严格模式)。 - Michael Morris
导入实际上非常聪明;dll可以将头文件导出为文本字符串,可以在任何平台上加载(前提是需要重新编译dll),在编译c代码之前,将该字符串粘贴到源代码中进行编译;有效地消除了对头文件的需求。我认为这是允许Java和其他动态语言不需要头文件但仍具有类型感知性的技术的一部分(尽管它们倾向于压缩类型信息而不是保留为字符串)。 - Dmytro
固定链接:https://gcc.gnu.org/onlinedocs/gcc-4.3.2/cpp/Obsolete-once_002donly-headers.html - Andrew

11

#import 是通常情况下的一个解决方案

#ifndef ...
#define ...
#include ...
#endif

这是一个解决方法。 #import 语句只会在之前未包含过该文件的情况下才会包含它。

值得注意的是,苹果的Objective-C也使用了 #import 语句。


6

这篇文章需要更新吗?

现在,由于C++20标准已发布,我们可以使用import语句进入“模块”范畴。

https://zh.cppreference.com/w/cpp/language/modules

在多个模块从代码的不同部分调用时编译速度方面,import语句似乎比旧的#include预处理器指令更快。


4
C++20的import与模块的"import"是完全不相关的,因为前者以预处理器字符'#'开头表示它是预处理指令,而后者是使用模块声明开始的关键字。 - Nick Huang
5
完全无关的导入?笑死我了。您能为SO读者辩护,而不仅仅是“告诉人们”如何使用预处理器指令这样显而易见的事情吗? 请问是否需要翻译其他内容? - Alex Vergara
我认为@NickHuang试图区分的是#importimport。这个问题涉及到MS #import语句,特别是与标签中的visual-c++相关。import关键字是一个相对较新的概念,在提出这个问题时它并不存在(在标准中)。 - cjds
4
我相信任何搜索 #includeimport 的人都会在第一时间找到这个问题,因此它是相关的,因为搜索引擎的限制。 - Louis Go
1
@LouisGo 这是真的。这个问题在谷歌搜索“C++ import”中排名第一。谢谢! - RomanMitasov

4
请注意,在gcc 4.1中,#import已经被弃用。如果您使用它,会收到以下警告:

#import是一个被弃用的GCC扩展


这并没有回答问题。 - S.S. Anne

4

import也是n2073,C++中的模块之一关键字,该提议由Daveed Vandevoorde于2006年9月提交给语言委员会。我不太了解语言方面的知识,不知道这个提议是否被彻底搁置或者是否正在等待作者或其他人的实现(概念证明)...


Daveed当时是EDG的员工,所以我期望他们有可用的代码。 - MSalters
1
我真希望他们已经做好了必要的准备工作,因为从“#include”转向导入机制会非常不错。但是我对这个功能几乎没有听到过任何消息,而且我很确定它不在C++0X中。也许在我退休之前会有所改变;^)~ - Don Wakefield
1
正如我所担心的那样,这还需要几年时间:C++09中的模块? - Don Wakefield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接