C 预处理器包含路径顺序
C Pre-Processor include-path order
我在 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”?还是我的理论错了?
//我在Ubuntu18上工作,我也安装了clang(不知道有没有关系)
不,它没有找到 /usr/include/x86_64-linux-gnu/bits/stdio.h
。
不递归搜索包含目录。
根据您问题的输出,GCC 将使用以下路径搜索 #include<stdio.h>
/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<bits/stdio.h>
,它会查找 /usr/include/x86_64-linux-gnu/bits/stdio.h
并使用它。错误消息是为了确保用户无法使用这样的包含,因为该文件是标准库的实现细节,用户代码不应使用它。
我在 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”?还是我的理论错了?
//我在Ubuntu18上工作,我也安装了clang(不知道有没有关系)
不,它没有找到 /usr/include/x86_64-linux-gnu/bits/stdio.h
。
不递归搜索包含目录。
根据您问题的输出,GCC 将使用以下路径搜索 #include<stdio.h>
/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<bits/stdio.h>
,它会查找 /usr/include/x86_64-linux-gnu/bits/stdio.h
并使用它。错误消息是为了确保用户无法使用这样的包含,因为该文件是标准库的实现细节,用户代码不应使用它。