有关LLVM / Clang的#include <filename>和#inlude“filename”有什么区别?</filename>

时间:2014-02-06 22:13:14

标签: c++ objective-c c clang llvm

#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首先看和/或不看?

2 个答案:

答案 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)所示。