【问题标题】:where are all the places C++ searches for includes?C++ 搜索的所有地方都在哪里?
【发布时间】:2013-02-17 19:59:31
【问题描述】:

有没有办法检查 C++ 搜索包含的所有位置?我想了解为什么有些包含可以找到而有些则没有。

编辑:平台是 Linux,g++

【问题讨论】:

  • 对于许多(大多数?)编译器,有一些方法,但它是特定于编译器的(例如,VC++ 使用INCLUDE 环境变量的内容)。
  • 当然取决于编译器。
  • 平台?编译器? IDE?
  • 在 GCC 上,您可以添加选项 -H 以显示包含内容。
  • 例如echo "#include " | gcc -E -x c -

标签: c++ include include-path


【解决方案1】:

这取决于编译器:您在尖括号中传递标头的位置,而双引号中的标头应位于以当前文件位置为根的路径;编译器还允许您为这些文件指定其他位置。

例如,gcc 有两个选项 - -I-i,用于指定指定为 <header.h>"header.h" 的标头位置。如果未指定-I,则默认位置为

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

按照the gcc documentation 的规定进行搜索。

【讨论】:

    【解决方案2】:

    16.2 [cpp.include] 为 C++ 定义了这个; C 语言几乎相同。

    #include <header.h> 在一组实现定义的位置中搜索具有该名称的“标题”。这个“头文件”不必是文件;它可能是编译器神奇地知道的东西。

    #include "header.h" 也搜索一组实现定义的位置,但它会查找名为“header.h”的文件。如果搜索失败,它会将指令视为#include <header.h>

    许多编译器通过查看“当前目录”来实现第二次搜索,对于某些编译器来说,这意味着启动编译器的目录,而对于其他编译器来说,意味着包含#include指令的文件所在的目录.

    一般来说,您应该为您的标题使用引用格式;尖括号,因为它们不需要文件,应该留给实现使用。并不是说为自己的标题使用尖括号不起作用,但它是反主题的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多