Мне известно, что тестирование __cplusplus
с помощью препроцессора возможно, однако фаза компиляторов в C ++ 20 поддерживается на разных этапах, так что это не является надежным индикатором в обоих направлениях.
Верно! Фактически, именно поэтому у нас теперь есть совершенно новый метод определения поддержки функций для компиляторов, которые находятся на разных этапах выпуска: макросы тестирования возможностей! Если вы посмотрите на SD-FeatureTest , то есть большие таблицы макросов, соответствующие каждому языку и библиотечной функции, принятой в стандарте, где каждый макрос будет определен с указанным значением после того, как функция будет принята.
В вашем конкретном c случае вы хотите __cpp_lib_endian
.
Теперь проблема с макросами библиотеки заключается в том, что мы начали добавлять их до того, как мы добавил место для их размещения - что будет <version>
. Если вы используете компилятор, который имеет <version>
(который будет g cc 9+, clang 7+ с libc ++, и я не знаю о MSV C), вы можете просто включить это. Но это может и не произойти, поэтому вам также может потребоваться включить правильный заголовок (в данном случае <bit>
).
#if __has_include(<bit>)
# include <bit>
# ifdef __cpp_lib_endian
# define HAS_ENDIAN 1
# endif
#endif
#ifdef HAS_ENDIAN
constexpr bool is_little_endian = std::endian::native == std::endian::little;
#else
constexpr bool is_little_endian = /* ... figure it out ... */;
#endif
Хотя может быть лучше сделать:
#ifdef HAS_ENDIAN
using my_endian = std::endian;
#else
enum class my_endian {
// copy some existing implementation
};
#endif
constexpr bool is_little_endian = my_endian::native == my_endian::little;