C++编译时cstdlib中的#include_next <stdlib.h>报错、解决与思考

TL;DR:如果之前没问题,突然出现这个错误,那可能是因为改了include搜索的路径(比如定义了CPLUS_INCLUDE_PATHC_INCLUDE_PATH环境变量)。如果确实如此,试试把这些变量取消或者从中删除含有stdlib.h的文件夹
(一个脑子正常的程序员不应该首先想到改系统里的标准库头文件内容!)

环境信息

  • OS:CentOS 7 Linux
  • 编译器:gcc (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11)

错误信息

如下图,编译时cstdlib报错,说里面的#include_next <stdlib.h>所要的stdlib.h找不着。
在这里插入图片描述但是这东西其实是存在的(我从来就没动过它):
我知道水印很大很碍眼,但我也没办法

相关背景知识

首先看到#include_next这玩意不太常见——我们正常都是#include,没next。那这个东西是干啥的呢?简单来说,它会include下一个(也就是按顺序找到的第二个)为此名字的头文件。
官方解释(英文):https://gcc.gnu.org/onlinedocs/cpp/Wrapper-Headers.html
CSDN解读(中文):https://blog.csdn.net/fjb2080/article/details/5247494

我就不继续解读了。对我们来说,问题是这玩意对include搜索的路径非常敏感!如果你定义了CPLUS_INCLUDE_PATH,里面又确实有个路径包含了stdlib.h(比如我就是把系统默认include路径/usr/include也加进去了),这就会影响include_next的行为,从而导致错误。

至于cstdlib里面为什么要有这个,据我理解是为了确保使用C语言的stdliib.h而非libstdc++的(因为如果直接include,好像是会优先找到和cstdlib在同一目录下的stdlib.h)。

而,我确实定义了CPLUS_INCLUDE_PATH,而且里面也确实带了包含stdlib.h的目录(系统默认include路径/usr/include)。所以——

解决办法

就是把我手贱加进去的/usr/include删掉。= =

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值