[这是我在 1997 年发布的关于两者之间区别的文章中的第一篇,以及如何使用它们的策略;第二篇可以在这里找到。为了方便在网页上阅读,我稍微修改了文本。]#include ""#include <>,以及如何使用它们的策略;第二篇可以在这里找到。我已对本文进行了少量修改以适应网页。]

新闻组:comp.lang.c
发件人:scs@eskimo.com (Steve Summit)
主题:Re: Quotes vs. angle brackets in #includes
Message-ID: <E9tIv9.EJo@eskimo.com>
日期: 1997 年 5 月 7 日,星期三,15:54:44 GMT

在文章 <1997May5.182655.28400@relay.nswc.navy.mil> 中,Donna Oliver 这样写道:
> 使用尖括号和#include
> 预处理指令,还是使用引号,哪一个更易于维护?

它们各有用途。对于标准头文件,您应该始终使用尖括号。对于您自己的、属于单个独立程序的头文件,您几乎总是应该使用双引号。对于第三方头文件,或者您用于多个大型项目的库的头文件,使用尖括号或双引号(以及您的编译器提供的用于扩展头文件搜索路径的任何机制)都是可行且可接受的策略。

> 另外,引号的解释是否与系统相关?也就是说,
> 预处理器对“当前目录”的解释是否会因
> 系统而异?

是的,差异很大。特别是,对于某些编译器/预处理器,“当前目录”始终是您调用编译器的目录,但对于其他编译器,它是包含该#include指令的文件的所在目录(换句话说,是包含该文件的目录)。后者策略虽然不太明显,但通常正是您想要的(当然,在某些情况下也可能不是;在某些情况下,它可能会非常麻烦 [脚注])。#include指令的文件。这个后者策略,虽然不太明显,但通常正是你想要的(当然,除了它不总是如此的时候;在某些情况下它会很烦人 [脚注])。

> 我无法从 FAQ 中获得任何关于此的见解。

问题 10.8 提到了我在这里讨论的一些内容。

Steve Summit
scs@eskimo.com

[*] 例如,如果您正在处理一个大型的多人项目,并且有中央目录存放官方或至少是主线开发版本的源代码和头文件,以及每个团队成员在将文件提交回主源代码树之前工作的个人“沙盒”目录,并且如果头文件可以#include包含其他头文件,并且您刚刚将一个头文件检出到您自己的“沙盒”包含目录中,对其进行了修改,然后重新编译,结果却发现您的更改*没有*生效,那么很可能是您修改的头文件被另一个头文件包含(使用双引号),而那个另一个头文件只存在于中央包含目录中,因此当任何其他源文件包含那个另一个头文件时,预处理器会从同一个“当前”中央包含目录中检索主线、未修改的版本,而不是您刚刚修改的版本。在这种情况下,您可能还需要检出那个另一个头文件的副本,即使您不需要修改它,只是为了让它放在您自己的私有包含目录中,以便其他包含项首先找到它,并使它包含的第二个头文件是您修改过的副本。

我想这也是反对嵌套包含文件的一个论据。另一方面,我所描述的这个问题只有在您使用双引号时才会出现。如果您为中央项目头文件(特别是对于嵌套包含的中央项目头文件)使用尖括号,预处理器永远不会从错误的“当前”目录开始,而是始终从头开始遍历搜索路径,并找到您想要的您私有的包含目录中的文件,无论如何。