编译期检测编译器对std::execution支持情况的宏定义实现求助
编译期检测编译器对std::execution支持情况的宏定义实现求助
嘿,我刚好在Android NDK开发中碰到过类似的问题,给你几个实用的编译期检测方案,帮你灵活切换std::execution和替代代码:
利用标准特性测试宏检测
C++标准提供了__cpp_lib_execution这个特性测试宏,用来判断是否支持std::execution相关功能(该宏在支持的编译器中会被定义为201902L及以上的值)。你可以直接用这个宏来做编译期判断:#include <type_traits> // 定义编译期宏标记是否支持std::execution #if defined(__cpp_lib_execution) && (__cpp_lib_execution >= 201902L) #define HAVE_STD_EXECUTION 1 #else #define HAVE_STD_EXECUTION 0 #endif // 使用示例:用if constexpr做分支处理 void process_data(auto& data) { if constexpr (HAVE_STD_EXECUTION) { // 这里编写依赖std::execution的代码,比如并行for_each std::for_each(std::execution::par, std::begin(data), std::end(data), [](auto& elem) { /* 并行处理逻辑 */ }); } else { // 这里编写替代逻辑,比如串行循环或者自定义的轻量并行实现 for (auto& elem : data) { /* 串行处理逻辑 */ } } }结合Android NDK平台与编译器版本双重检测
有些情况下,部分NDK版本可能虽然定义了__cpp_lib_execution,但实际链接或运行时会出问题。这时候可以结合Android平台和Clang版本做更严格的判断(比如NDK r25之前的Clang版本基本不完整支持std::execution):#include <type_traits> #if defined(__ANDROID__) && defined(__clang__) // 根据NDK对应的Clang版本调整阈值,这里以Clang 14为分界 #if __clang_major__ < 14 || (__clang_major__ == 14 && __clang_minor__ < 0) #define HAVE_STD_EXECUTION 0 #else #if defined(__cpp_lib_execution) && (__cpp_lib_execution >= 201902L) #define HAVE_STD_EXECUTION 1 #else #define HAVE_STD_EXECUTION 0 #endif #endif #else // 非Android平台直接用标准特性宏判断 #if defined(__cpp_lib_execution) && (__cpp_lib_execution >= 201902L) #define HAVE_STD_EXECUTION 1 #else #define HAVE_STD_EXECUTION 0 #endif #endif
另外要提醒你,使用这些检测的前提是编译时已经开启了C++20支持(比如在NDK配置中添加cppFlags += "-std=c++20"),不过即使开启了,旧版本NDK依然无法支持,所以这个编译期检测就显得尤为必要。
备注:内容来源于stack exchange,提问作者madan kandula
相关产品推荐
相关产品推荐

