c - C预处理器包含路径顺序
问题描述
我在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/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
并使用它。错误消息是为了确保用户不能使用这样的包含,因为该文件是标准库的实现细节,用户代码不应使用。
推荐阅读
- python - 嵌套for循环遍历python列表
- android - 在后台工作有哪些限制?
- highcharts - Highcharts 在工具提示中获取图例“图标”
- c# - 如何将图像和文本嵌入到一条消息中?
- python - Django -- 新字段:如何为现有对象设置默认可调用对象
- entity-framework - 实体框架 - 字段是必需的,但存在
- javascript - ng-model 值中的 AngularJS 时间未传递给控制器
- android - 拍摄的图像质量降低
- c# - 使用 C# 和 Selenium Webdriver 在 nunit 3 中调用事件监听器
- c++ - Boost::Beast Websocket 双向流 (C++)