【C++】#include_next指令

(点击上方公众号,可快速关注)

今天在Debian1系统上使用NetBeans2写C++程序,在键入#include时IDE有#include_next的提示。这个预编译指令以前没有接触过,本篇文章做个总结。

[1]    一种Linux发行版。

[2 ]    一种支持多种语言开发的集成开发环境。

是标准C/C++扩展吗?

不是。是GNU的扩展,所以如果你使用Windows 的MSVC的话是使用不了#include_next的。

用途是什么?

GCC的文档2.7节Wrapper Headers解释得很清楚,下面的内容仅仅是这一节的翻译:

有时需要调整系统提供的头文件的内容而不编辑是很必要的,如,GCC的fixincludes操作提供了这种功能。一种方式是新建一个同名的头文件,并将其排在原有头文件的搜索路径之前。如果你愿意彻底替换掉老的头文件的话,这种方式是没问题的。但是,如果你要从新的头文件里访问这个老的头文件呢?

你不能简单的使用#include引入老的头文件。这样的话,会从搜索路径里再次找到新的头文件(因为新的头文件在搜索路径里排在老的头文件之前)。如果你的头文件没有使用多头文件引入保护,会出现无限递归并且导致严重的错误。

当然,你可以使用绝对路径引入老的头文件:

#include "/usr/include/old-header.h"

这种方式是可行的,但不够简洁;若系统头文件移动,你将不得不修改新的头文件里的老的头文件的路径。

在C标准里没有办法解决这个问题,但你可以使用GNU的#include_next扩展。它意味者:使用这个名字引入下一个文件。这个指令跟#include工作方式类似,除了对指定文件的搜索方式上:在一个目录下找到了当前的文件,这时不会停止查找,它开始在后续的头文件目录列表里继续查找`#include_next所引入的文件。

举例来说,你指定了-I /usr/local/include,并且待搜索的目录列表包含/usr/include,这两个目录里都包含signal.h文件。普通的#include能找到/usr/local/include里的文件。若那个文件里含有#include_next,它开始在所在目录之后查找,并找到/usr/include里的signal.h

#include_next不区分<file>"file"这两种方式的引入,它也不检查当前文件和所引入的文件是否同名。它只是简单地在当前所找到文件的目录之后查找include_next所引入的文件。

include_next的使用会导致较大的混淆。我们建议只是在没有其他方式可用的情况下使用它。特别不能在某个具体程序所拥有的头文件里使用它;类似于fixincludes,它应该仅仅用于全局的修正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译opencv 3.2时,报错"/usr/include/c /7/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录 #include_next <stdlib.h> ^~~~~~~~~~",可以通过以下解决办法解决这个问题。 一种解决办法是在/build目录下的cmake文件中添加指令"-D ENABLE_PRECOMPILED_HEADERS=OFF"。例如,可以执行以下命令来编译opencv: cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D ENABLE_PRECOMPILED_HEADERS=OFF \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules \ -D BUILD_EXAMPLES=ON .. 另一种解决办法是安装缺失的文件。例如,在编译pycaffe时报错"fatal error: numpy/arrayobject.h没有那个文件或目录",可以尝试使用以下命令来安装缺失的文件: sudo apt-get install ... 这些方法可以帮助您解决编译opencv时出现的错误"/usr/include/c /7/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录 #include_next <stdlib.h> ^~~~~~~~~~"和编译pycaffe时出现的错误"fatal error: numpy/arrayobject.h没有那个文件或目录"。希望能对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [编译opencv 3.2 报错 /usr/include/c++/7/cstdlib:75:15: fatal error: stdlib.h: No such file or ...](https://blog.csdn.net/Undefinedefity/article/details/122018986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录](https://download.csdn.net/download/weixin_38747025/14839519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值