이 주제에 대해 많은 질문을 받았지만 지금까지는 해결책을 찾지 못했습니다. 여기에 하나의 자연 해법이 언급되었습니다 : Determining endianness at compile time.
그러나 관련된 질문에 언급 된 대답은 &입니다.C++을 사용하여 컴파일 타임에 프로그래밍 방식으로 엔디안 찾기 11
몇 가지 수정 사항과 함께 경고없이 g ++ & clang ++ (-std=c++11
)과 유사한 솔루션을 컴파일 할 수 있습니다.
static_assert(sizeof(char) == 1, "sizeof(char) != 1");
union U1
{
int i;
char c[sizeof(int)];
};
union U2
{
char c[sizeof(int)];
int i;
};
constexpr U1 u1 = {1};
constexpr U2 u2 = {{1}};
constexpr bool IsLittleEndian()
{
return u1.i == u2.c[0]; // ignore different type comparison
}
static_assert(IsLittleEndian(), "The machine is BIG endian");
Demo.
endian-ness를 결정하는 데 결정적인 방법으로 간주 될 수 있습니까? 아니면 type-punning 또는 다른 것을 놓치지 않을 수 있습니까?
'uint8_t (u2.i)'가 endianness에서 동일한 값을 생성하지 않습니까? 캐스트는 첫 번째 바이트를 선택하는 것이 아니라 값을 보존해야합니다. –
4 바이트 정수 내에 24 개의 가능한 바이트 순서가 있습니다. 적어도 실제 컴퓨터에서는 3 개가 사용되었습니다. 또한 [[un']'signed']'char'에 부여 된 엄격한 앨리어스 규칙에 대한 예외가'uint8_t'에 적용된다는 것은 완전히 명확하지 않습니다. –
@BoPersson, 나는 "다른 크기 유형의 비교"와 관련된 가능한 컴파일러 경고를 피하고자했습니다 (Q! 여기부터 1이 가장 작은 유형으로 표현 될 것이고, 형변환에 적합하다는 것을 알았습니다. 또는 나는 당신의 우려를 오해 했습니까? 코드를 조금 수정합니다. – iammilind