#include <filename>
和#include "filename"
之间的差异是特定于编译器的实现(What is the difference between #include <filename> and #include "filename"?)。 GCC对此的实施已有详细记录(http://gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html)。 Visual C ++存在类似的文档。
使用LLVM / Clang编译时有哪些相应的规则?也就是说,在使用每种语法时,Clang首先看和/或不看?
答案 0 :(得分:0)
我无法在文档中找到指定每种情况下预期行为的任何内容,所以我很好奇并决定查看here中的代码。可能错误地认为这是它将始终如何表现,但没有文档,我想源代码是下一个最好的事情。
通过代码搜索,我发现#include
方法(第453行)中HandlePragmaDependency
编译指示已处理here,其中确定是否包含isAngled
(第468行)然后将该值用作LookupFile()
方法的参数(第477行)。
此方法在HeaderSearch.cpp(第498行)中定义,其文档注释指出:
[...] isAngled表示文件引用是否适用于系统#include&#39; s 与否(即使用&lt;&gt;而不是&#34;&#34;)。 [...]
稍后在该方法中,isAngled
的值用于三个地方(第547,596和673行),每个地方都有以下注释。
// Unless disabled, check to see if the file is in the #includer's
// directory. This cannot be based on CurDir, because each includer could be
// a #include of a subdirectory (#include "foo/bar.h") and a subsequent
// include of "baz.h" should resolve to "whatever/foo/baz.h".
// This search is not done for <> headers.
if (!Includers.empty() && !isAngled && !NoCurDirSearch) {
...
// If this is a system #include, ignore the user #include locs.
unsigned i = isAngled ? AngledDirIdx : 0;
...
// If we are including a file with a quoted include "foo.h" from inside
// a header in a framework that is currently being built, and we couldn't
// resolve "foo.h" any other way, change the include to <Foo/foo.h>, where
// "Foo" is the name of the framework in which the including header was found.
if (!Includers.empty() && !isAngled &&
Filename.find('/') == StringRef::npos) {
希望它有所帮助。
答案 1 :(得分:0)
<强>语法:强>
#include < filename >
(1)
#include "filename"
(2)
<强>解释强>
将包含文件名的源文件包含在紧接指令后的行的当前源文件中。
1)以实现定义的方式搜索文件。此语法的目的是搜索受实现控制的文件。典型实现仅搜索标准包含目录。标准C ++库和标准C库隐式包含在这些标准包含目录中。标准包含目录通常可由用户通过编译器选项控制。
2)以实现定义的方式搜索文件。此语法的目的是搜索不受实现控制的文件。典型实现首先搜索当前文件所在的目录,并且只有在找不到该文件时,才搜索标准包含目录,如(1)所示。