__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
相关产品推荐
相关产品推荐

