关于c ++:关于””和<>的使用规则是什么

What are the rules on #include “xxx.h” Vs #include <xxx.h>?

本问题已经有最佳答案,请猛点这里访问。

如果我有自己的库项目,在我的应用程序中,我应该使用哪个样式来#include来自它们的头?是否有严格的规则,这两个规则对编译器/预处理器实际上有不同的含义,还是只是关于标准?


根据ISO标准,几乎没有什么规则。这两个表单的实现依赖于它们查找头文件的位置。它们甚至不必是文件。

C++ 11中的EDOCX1的7个部分没有区别这两个变体,除了EDOCX1的9个变量和EDCOX1(10)在EDOCX1 11个变体中可以包含EDOCX1×8Ω的事实之外,但是很少有人会愚蠢到使用文件名中的那些字符:

16.2节进一步说明:

A preprocessing directive of the form # include < h-char-sequence> new-line searches a sequence of implementation-defined places for a header identified uniquely by the specified sequence between the < and > delimiters, and causes the replacement of that directive by the entire contents of the header. How the places are specified or the header identified is implementation-defined.

A preprocessing directive of the form # include" q-char-sequence" new-line causes the replacement of that directive by the entire contents of the source file identified by the specified sequence between the " delimiters. The named source file is searched for in an implementation-defined manner. If this search is not supported, or if the search fails, the directive is reprocessed as if it read # include < h-char-sequence> new-line with the identical contained sequence (including > characters, if any) from the original directive.

我倾向于使用<>作为系统头,使用""作为自己的头,但这只是个人偏好。我注意到前面提到的C++ 11文档状态:

Note: Although an implementation may provide a mechanism for making arbitrary source files available to the <> search, in general programmers should use the <> form for headers provided with the implementation, and the "" form for sources outside the control of the implementation.

这不是强制性的,但这是一个好主意。


通常,使用引号意味着头文件位于项目目录的相对位置。另一方面,如果使用尖括号,编译器会希望头文件的位置是标准位置。例如/usr/include/usr/local/include或编译器的任何其他默认位置。

在gcc中,如果使用-I标志,也会在指定的位置搜索带角括号的includes。

例子:

1
$ gcc -Wall -I/path/to/my/library/include myfile.c

所以如果你在/path/to/my/library/include中有myfile.h,你可以在myfile.c源中使用#include


在几个不同的操作系统上使用了几十个编译器之后,我的建议是只将用于系统和操作特定的header includes,将"y.h"用于其他所有内容,包括库和项目头。

然后,使用编译器的-I选项(或其他选项)设置适当的包含搜索路径。如果您使用像makeant这样的东西来进行构建,这会更容易。

对于第三方软件报头,您可以使用任何一种形式。如果安装了该软件包,并且所有用户都可以访问该软件包(例如,在/usr/local/bin/usr/site/bin之类的地方),那么格式可能更正确。如果它安装在本地构建树中,那么"y.h"表单更为正确,因为它是在您的构建过程中控制的。

这种组合是最便携的。


它影响预处理器搜索包含文件的位置。来自MSDN:

"带引号的表单:此表单指示预处理器在包含include语句的文件的同一目录中查找include文件,然后在包含(include)该文件的任何文件的目录中查找include文件。"然后,预处理器沿着/i编译器选项指定的路径进行搜索,然后沿着include环境变量指定的路径进行搜索。

尖括号形式:此形式指示预处理器首先沿/i编译器选项指定的路径搜索包含文件,然后在从命令行编译时,沿include环境变量指定的路径搜索包含文件。"

作为一个粗略的指南,我只在试图指定一个与包含文件的目录相关的路径时使用引号。否则,我只使用尖括号。作为我当前项目的一个例子:

1
2
3
4
5
6
7
8
9
#include  // standard library headers
#include <numeric>
#include <stack>

#include <boost/function.hpp> // third-party library headers
#include <boost/lexical_cast.hpp>

#include <common/io/util/LineIO.h> // specified relative to my own base include dir
#include"PartitionForest.h" // a header in the current directory