You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

__has_include的正确用法是什么?未知xyzzy头文件位置时如何编写代码?

__has_include 的正确用法及头文件包含逻辑

__has_include 是C++17引入的预处理器特性,用于编译期检查指定头文件是否存在,它支持两种参数形式,对应不同的头文件查找规则:

  • 双引号包裹的"xyzzy":遵循用户头文件查找逻辑——先检索当前源文件所在目录,再遍历编译器指定的用户头文件路径
  • 尖括号包裹的<xyzzy>:遵循系统头文件查找逻辑——直接检索编译器指定的系统头文件路径

两种写法的适用场景

如果不确定xyzzy头文件的具体位置,第一种写法是更严谨的选择:

#if __has_include("xyzzy")
# include "xyzzy"
#elif __has_include(<xyzzy>)
# include <xyzzy>
#else
# include <something-else>
#endif

这么写的原因很直接:

  • 优先检查项目本地或用户自定义路径下的xyzzy(比如你自己编写的项目头文件),存在就直接包含
  • 如果用户路径里找不到,再去系统路径里找同名头文件(比如系统自带的库或者第三方安装的库)
  • 两种路径都找不到时,才降级使用备选的something-else

而第二种写法只检查了用户路径,会直接忽略系统路径中可能存在的xyzzy,只有当你明确目标头文件只可能在用户路径下时,这种写法才适用。

结论

不确定头文件位置时,一定要加上#elif __has_include(<xyzzy>)的分支,这样能覆盖所有可能的头文件存在场景,避免不必要的编译错误。

内容的提问来源于stack exchange,提问作者David Partridge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:54:51