Определить версию g cc -toolchain в препроцессоре clang ++ - PullRequest
1 голос
/ 20 февраля 2020

Согласно cppreference , g cc 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__ я бы хотел проверить версию g cc 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

, т. Е. Набор инструментов g cc относится к g cc 8.3.0, но значение __GNUC__ равно 4.

Какой хороший способ запросить версию набора инструментов g cc в препроцессоре с помощью clang? В идеале это способ проверки версии libstdc ++ способом, совместимым для g ++ и clang ++, так что мне не нужно писать спагетти, если сначала проверяется компилятор.

1 Ответ

0 голосов
/ 20 февраля 2020

Grepping для ^#.*define.*9 в заголовках компилятора g cc 9 кажется, что

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

может сделать эту работу. Из этого представления соответствия эта переменная была введена с помощью цепочки инструментов g cc 7.

...