Этот тест не может работать для директивы if препроцессора.
Предполагается, что в следующем C ++ 20 будет std::endian
.Его можно использовать без предварительного процессора.
static_assert(std::endian::native == std::endian::big
|| std::endian::native == std::endian::little);
struct ABig {
char a:4;
char b:4;
};
struct ALit {
char b:4;
char a:4;
};
using A = std::conditional_t<std::endian::native == std::endian::big, ABig, ALit>;
До C ++ 20 стандартного способа получения порядкового номера не существует.
Переносимое решение заключается в использовании предопределенныхмакросы для обнаружения системы.Некоторые системы имеют прямой порядок байтов (Windows), в то время как другие предоставляют заголовок с определениями макросов (<endian.h>
в Linux, <sys/endian.h>
в BSD и т. Д.), А другие могут отличаться другим способом.Компилятор GCC предоставляет макросы:
__BYTE_ORDER__
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
__ORDER_PDP_ENDIAN__
Тем не менее, практически каждый аспект представления битовых полей определяется реализацией, и, если важно, чтобы порядок был точным - как он выглядитбыть - тогда вам все равно придется полагаться на конкретную реализацию, поэтому переносимость не достижима.Определите свою целевую систему, и как только вы решите, обратитесь к документации этой системы, чтобы узнать, как получить порядковый номер.
Лучше не полагаться на представление битовых полей.