GCC/Clang中__cpp_lib_generic_unordered_lookup特性测试宏缺失问题
问题解答
1. 特性测试宏是否为强制要求存在
C标准中定义的库特性测试宏属于可选实现的内容,标准没有强制要求标准库实现方必须在支持对应特性时同步定义对应的测试宏。
多数实现方会优先完成特性本身的功能开发,在后续迭代版本中才补充对应特性测试宏的定义:你使用的GCC 11版本的libstdc已经实现了unordered_map异构查找功能,但直到GCC 12版本的libstdc++才正式添加__cpp_lib_generic_unordered_lookup宏的定义,所以GCC 11编译时宏未定义属于正常情况。
2. 该问题是否与安装/配置方式有关
你遇到的Clang下宏未定义的问题和编译配置直接相关:
- 你找到的定义了
__cpp_lib_generic_unordered_lookup宏的$HOME/opt/include/c++/v1/version是Clang自带的libc++标准库的头文件 - 你编译时没有加
-stdlib=libc++参数的情况下,Clang默认会使用GCC的libstdc作为标准库(从你贴的unordered_map.h路径$HOME/opt/include/c++/11.1.0/bits/unordered_map.h也能验证这一点,该路径属于libstdc的目录结构),自然不会加载libc++的version头文件,也就读不到对应的宏定义。
如果需要使用libc++的版本,可以用如下命令编译:
clang++ featuretest.cpp -std=c++2a -stdlib=libc++
此时就能看到宏已定义的提示。
内容的提问来源于stack exchange,提问作者137
相关产品推荐
相关产品推荐

