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

What is the difference between #import and #include in C?

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

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

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

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

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

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

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

如评论中所述,#import 不是标准的,对于不同的编译器可能意味着不同的东西。

以微软的编译器为例,#import can automatically generate and include a header file at compilation time.

简单。可以相同;但有些编译器对#import 的处理方式不同,例如 Microsoft 编译器:它会在编译时自动包含指定的文件。