C++#include和#import的区别
Posted
技术标签:
【中文标题】C++#include和#import的区别【英文标题】:C++ #include and #import difference 【发布时间】:2010-09-15 09:29:04 【问题描述】:C++ 中#include
和#import
有什么区别?
【问题讨论】:
注意#import
for vc++ 和 gcc 与 import
of C++20 不同。
【参考方案1】:
在 VC++ 中导入: #import
用于类型库或 .tlbs(COM 内容)。
类型库的内容被转换为 C++ 类,主要是自动为您描述 COM 接口,然后将其包含到您的文件中。
#import
指令由 Microsoft 作为 C++ 语言的扩展引入。你可以在this MSDN article阅读它。
#import
指令也用于 .NET / CLI 的东西。
在 gcc 中导入:
gcc 中的导入与 VC++ 中的导入不同。这是一种最多只包含一次标题的简单方法。 (在 VC++ 和 GCC 中,您也可以通过 #pragma
执行此操作)
#import
指令在 3.4 版中被 gcc 团队正式弃用,并且在所有支持的 gcc 之前版本中 99% 的时间都可以正常工作
包括: #include
主要用于头文件,但将内容添加到当前文件中。 #include
是 C++ 标准的一部分。你可以在this MSDN article阅读它。
【讨论】:
您的 MSDN 链接已过时。谢谢微软。【参考方案2】:#import
是微软特有的东西,显然只适用于 COM 或 .NET 的东西。
#include
是标准 C/C++ 预处理器语句,用于在源代码文件中包含头文件(或偶尔包含其他源代码)。
【讨论】:
这不是真的。 #import 指令在 3.4 版中被 gcc 团队正式弃用,并且在所有支持的 gcc 以前版本中 99% 的时间都可以正常工作 很好奇,我没有意识到这一点。也许我应该说它是特定于 COM 和 .NET 的东西。 gcc 支持的#import 是一种仅包含一次标头的不可移植方式:gcc.gnu.org/onlinedocs/gcc-4.3.2/cpp/…>。它与 Microsoft COM #import 完全无关。 GCC #import 实际上是一个 Objective-C 预处理器命令,恰好可以在 gcc 和 clang 中处理 .c 文件(除了迂腐模式)。 import 其实很聪明; dll可以在编译c代码之前将headers导出为可以在任何平台上加载的文本字符串(授予dll需要重新编译),并在编译之前将字符串粘贴到源代码中;有效地完全消除了对头文件的需求。我认为这是允许 java 和其他动态语言没有头文件但仍然具有类型意识的技术的一部分(当然他们倾向于压缩类型信息而不是将其保留为字符串)。【参考方案3】:#import
总体上是一个解决方案对通常情况的解决方案
#ifndef ...
#define ...
#include ...
#endif
解决方法。 #import
仅包含以前未包含的文件。
值得注意的是,Apple 的 Objective-C 也使用了#import
语句。
【讨论】:
【参考方案4】:import 也是与 n2073, Modules in C++ 相关的关键字之一,由 Daveed Vandevoorde 于 2006 年 9 月向语言委员会提出。我不是一个语言极客,无法知道该提案是否适用最终搁置,或者如果它正在等待作者或其他人的实施(概念证明)......
【讨论】:
Daveed 当时是 EDG 的一名员工,所以我希望他们有这么有效的代码。 我当然希望他们已经完成了必要的工作,因为从“#include”转移到导入机制会非常好。但是我没有听说过这个特性,而且我很确定它不在 C++0X 中。也许在我退休前的某个时候;^)~ 正如我所担心的那样,已经过了几年:Modules in C++09?【参考方案5】:请注意,在 gcc 4.1 中,#import
已弃用。如果你使用它,你会得到警告:
#import
是一个已弃用的 GCC 扩展
【讨论】:
这没有回答问题。【参考方案6】:这篇文章应该更新吗?
现在,由于 C++20 标准已经发布,我们可以使用 import
语句进入范围“模块”。
https://en.cppreference.com/w/cpp/language/modules
就从代码的不同部分调用多个模块时的编译速度而言,import 语句似乎比旧的#include
preprocesor 指令更快。
【讨论】:
c++20 import 完全无关紧要,因为以预处理器字符“#”开头表示它是预处理器指令,而模块“import”是以模块声明开头的关键字。 导入完全不相关? LMAO。您能否为您对 SO 读者的回答辩护,而不是仅仅“告诉人们”诸如什么是预处理指令之类的显而易见的事情? 我认为@NickHuang 试图区分#import
和import
。这个问题是回复:MS #import
声明,特别与标签中的visual-c++
相关。 import
关键字是一个新概念,在提出这个问题时(在标准中)并不存在。
我相信搜索#include
和import
的人也会首先找到这个问题。由于搜索引擎的限制,所以它是相关的。
@LouisGo 这是真的。该问题在 Google 的“C++ 导入”搜索结果中排名前 1。谢谢!以上是关于C++#include和#import的区别的主要内容,如果未能解决你的问题,请参考以下文章
#import#include#import<>和#import””的区别
IOS开发之----#import#include和@class的区别