c - C中的#import和#include有什么区别?

标签 c import include header-files

我已经阅读了一些关于预处理器指令的内容,并且我已经看到#import 在 C 程序中被使用了几次。我不确定它们之间有什么区别,有些网站说#include 仅用于头文件而#import 在 Java 中使用较多,在 C 中已弃用。

如果是这样,为什么有些程序仍然使用#import,它与#include 究竟有何不同?此外,我在我的一些 C 程序中使用了#import,它似乎工作正常并且与#include 做同样的事情。

最佳答案

这在 Gnu CPP(C 预处理器)手册中有很好的解释,尽管在 clang 中的行为是相同的(可能还有其他 C 编译器,但不是 MSVC):

  1. The problem .简介:您通常不希望将相同的 header 两次包含到单个翻译单元中,因为这会导致重复声明,这是一个错误。但是,由于包含的文件本身可能想要包含其他文件,因此很难避免。

  2. Some non-standard solutions (包括 #import)。摘要:including 文件中的#importincluded 文件中的#pragma once 都可以防止重复包含。但是 #pragma once 是一个更好的解决方案,因为包含程序不需要知道是否可以接受重复包含。

链接文档将 #import 称为“不推荐使用的扩展”,这是描述从来不属于任何标准 C 版本的功能的一种稍微奇怪的方式。但这并非完全没有意义:许多预处理器实现确实允许 #import(这是 Objective-C 的一个特性),因此它是一个常见的扩展。称其为已弃用是一种说法,即该扩展永远将成为任何 C 标准的一部分,无论实现有多广泛。

如果你想使用扩展,使用#pragma once;这也可能不会出现在未来的标准中,但是为给定的头文件更改它只需要在一个地方进行更改,而不是在包含头文件的每个文件中进行更改。 C++ 甚至 C 都可能在某个时候开发出某种模块特性,最终将允许包含保护被替换。

关于c - C中的#import和#include有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39280248/

相关文章:

Python 导入迭代,sys.path

excel - 导入带有 SSIS 的 Excel (.xlsx) 和带有包含多个小节的工作表的 Excel 源

linux - 如何查找 lua 应用程序中包含的库

html - 在网页上输出文本文件的内容

ruby-on-rails - 缩短respond_with(:include => xxx)

c - 正确释放动态分配的结构

c - 如何打印包含特殊字符并从文件中读取的字符串?如何打印没有特殊字符?

c - C 中的递归,内部有一个数组和一个索引

perl - 如何使用 require 从 Exporter Perl 模块导入符号?

将温度从摄氏温度转换为华氏温度