【问题标题】:C Pre-Processor include-path orderC 预处理器包含路径顺序
【发布时间】:2020-04-22 10:05:17
【问题描述】:

我在 linux 上输入了“cpp -v”,结果如下:

#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

所以我按照 CPP 的顺序搜索了 stdio.h,我首先在“/usr/include/x86_64-linux-gnu”找到了它。 具体来说,它的完整路径是“/usr/include/x86_64-linux-gnu/bits/stdio.h”

但是当我打开文件时,它在 21-23 行明确说明:

#ifndef _STDIO_H
# error "Never include <bits/stdio.h> directly; use <stdio.h> instead."
#endif

所以,理论上当我输入我的 C 源代码时:

#include <stdio.h>

预处理器在“/usr/include/x86_64-linux-gnu/bits/stdio.h”找到它,并包含它。 这怎么可能?是否存在使 CPP 忽略“./bits/stdio.h”的机制?还是我的理论错了?

//我在Ubuntu 18上工作,我也安装了clang(不知道是否重要)

【问题讨论】:

  • /usr/include/x86_64-linux-gnu/bits/ 不在搜索路径列表中。要包含该文件,需要执行 #include &lt;bits/stdio.h&gt;
  • 您可以通过查看here找到包含的实际标头
  • 您可以使用gcc -H … 查看编译中实际包含的标头。

标签: c linux gcc include-path


【解决方案1】:

不,它没有找到/usr/include/x86_64-linux-gnu/bits/stdio.h

不递归搜索包含目录。

根据您的问题的输出,GCC 将使用以下路径搜索 #include&lt;stdio.h&gt;

/usr/lib/gcc/x86_64-linux-gnu/7/include/stdio.h
/usr/local/include/stdio.h
/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed/stdio.h
/usr/include/x86_64-linux-gnu/stdio.h
/usr/include/stdio.h

按这个顺序。仅此而已。

由于/usr/include/x86_64-linux-gnu/stdio.h不存在,所以不能使用。

只有(最有可能)在查找 /usr/include/stdio.h 时,它才会找到一个文件并使用它。


这也是您所指的错误消息所指示的内容。如果你做了#include&lt;bits/stdio.h&gt;,它会寻找/usr/include/x86_64-linux-gnu/bits/stdio.h 并使用它。错误消息用于确保用户无法使用此类包含,因为该文件是标准库的实现细节,用户代码不应使用。

【讨论】:

  • 是的,谢谢!我不知道 CPP 不会递归搜索。
猜你喜欢
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多