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找不着。
C++编译时cstdlib中的#include_next <stdlib.h>报错、解决与思考_第1张图片但是这东西其实是存在的(我从来就没动过它):
我知道水印很大很碍眼,但我也没办法

相关背景知识

首先看到#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删掉。= =

你可能感兴趣的:(c++,开发语言)