【问题标题】:How does cpp preprocessor pick up header from subdirectoriescpp预处理器如何从子目录中获取头文件
【发布时间】:2015-07-31 18:26:49
【问题描述】:

我想以我是 c++ 初学者的免责声明开始我的问题。

我的问题是预处理器在查找头文件时如何知道要查找哪些目录。

我知道它会搜索一些特定的预定义位置以及我们在 g++ 编译步骤中作为 -I 传递的任何内容。然而让我感到困惑的是,即使它们不在这些位置,也会拾取一些标准标题。

我在Finding out what the GCC include path is 提到了这个问题,并按照那里的步骤进行操作。

$ /usr/include % echo | cpp -Wp,-v 
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.9/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"

但我试图找到 iostream 并且我看到了

$ locate iostream
/usr/include/c++/4.8/iostream

它位于 /usr/include/c++/4.8/iostream ,但搜索路径以 /usr/include 结束。如果它是任何其他头文件,我将不得不将其包含为 #include &lt;c++/4.8/iostream&gt;,但在我使用的所有程序中#include &lt;iostream&gt;

PS:我之所以问这个问题是因为我不小心删除了/usr/include/c++/4.9目录,它曾经在删除之前工作。但它没有收到 usr/include/c++/4.8/cstddef 。我想了解获取正确包含 C++ 预处理器路径的过程。

谢谢

【问题讨论】:

  • 我不记得我在哪里读到的,所以这可能需要谨慎对待:标准包含文件甚至不需要是磁盘中的文件。编译器如何处理这些完全取决于制作编译器的人。重点是,例如,如果您 #include &lt;iostream&gt;,您将可以访问所有应该带来的内容。

标签: c++ g++ c-preprocessor


【解决方案1】:

它们已被编译。确保指定正确的语言。

$ echo | cpp -Wp,-v -x c++
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.9.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2
 /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/backward
 /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include
 /usr/local/include
 /usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2012-11-23
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多