What are the rules on #include “xxx.h” Vs #include <xxx.h>?
如果我有自己的库项目,在我的应用程序中,我应该使用哪个样式来
根据ISO标准,几乎没有什么规则。这两个表单的实现依赖于它们查找头文件的位置。它们甚至不必是文件。
C++ 11中的EDOCX1的7个部分没有区别这两个变体,除了EDOCX1的9个变量和EDCOX1(10)在EDOCX1 11个变体中可以包含EDOCX1×8Ω的事实之外,但是很少有人会愚蠢到使用文件名中的那些字符:
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.
我倾向于使用
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.
这不是强制性的,但这是一个好主意。
通常,使用引号意味着头文件位于项目目录的相对位置。另一方面,如果使用尖括号,编译器会希望头文件的位置是标准位置。例如
在gcc中,如果使用
例子:
1 | $ gcc -Wall -I/path/to/my/library/include myfile.c |
所以如果你在
在几个不同的操作系统上使用了几十个编译器之后,我的建议是只将
然后,使用编译器的
对于第三方软件报头,您可以使用任何一种形式。如果安装了该软件包,并且所有用户都可以访问该软件包(例如,在
这种组合是最便携的。
它影响预处理器搜索包含文件的位置。来自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 |