在clang++预处理器中确定gcc工具链版本

Determine gcc-toolchain version in clang++ preprocessor

本文关键字:gcc 工具 版本 clang++ 预处理 处理器      更新时间:2023-10-16

根据cppreference,gcc-libstdc++支持并行TS。用外行的话说,对我来说,这意味着#include <execution>在g++9中工作,在g++8或之前不工作。在我的源代码中,我可以用处理这个问题

#if ( defined( __GNUC__ ) && __GNUC__ > 8 )
#  define can_use_std_execution
#  include <execution>
#endif

对于我的clang++构建,<execution>的可用性取决于我使用的--gcc-toolchain。因此,我不想检查__clang_major__,而是想检查预处理器中的gcc-libstdc++版本。

在这个编译器资源管理器示例中,__GNUC__是在clang中定义的,但编译命令是

-g -o /tmp/compiler-explorer-compiler120120-1672-4ffux6.smufm/output.s -mllvm --x86-asm-syntax=intel -S --gcc-toolchain=/opt/compiler-explorer/gcc-8.3.0 -fcolor-diagnostics -fno-crash-diagnostics /tmp/compiler-explorer-compiler120120-1672-4ffux6.smufm/example.cpp

即gcc工具链来自gcc 8.3.0,但__GNUC__的值为4。

用clang在预处理器中查询gcc工具链版本的好方法是什么?理想情况下,这是一种以兼容g++和clang++的方式检查libstdc++版本的方法,这样,如果先检查编译器,我就不必写意大利面条了。

在gcc9的编译器头中为^#.*define.*9进行Grepping似乎

#include <bits/c++config.h>
#if _GLIBCXX_RELEASE > 8
#  include <execution>
#endif

能胜任这份工作。从这个一致性视图来看,这个变量是在gcc7的工具链中引入的。