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

时间:2016-09-01 20:19:38

标签: c import include header-files

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

  3. 链接文档调用#import a"不推荐使用的扩展名",这是描述一个从未成为任何标准C版本的功能的奇怪方式。但它并非毫无意义:许多预处理器实现都允许#import(这是Objective-C的一个特性),因此它是一个常见的扩展。调用它已弃用是一种说法,无论实现的广泛程度如何,扩展都永远不会成为任何C标准的一部分。

    如果您想使用扩展程序,请使用#pragma once;也可能不会出现在未来的标准中,但是为给定的头文件更改它只需要在一个地方而不是在包含标题的每个文件中进行更改。 C ++甚至C很可能在某种程度上开发某种模块功能,这将使包含警卫最终被替换。

答案 1 :(得分:2)

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

使用Microsoft的编译器,例如#import can include a header file that is automatically generated at compilation time