`__STDC_ENDIAN_LITTLE__`, `__STDC_ENDIAN_BIG__`, `__STDC_ENDIAN_NATIVE__` — 엔디언 매크로
__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_BIG__, __STDC_ENDIAN_NATIVE__ — 엔디언 매크로 (C23)
프로그램을 다른 기기로 옮겨서 돌리다 보면, 메모리에서 바이트가 저장되는 순서, 즉 엔디언(endianness)이 달라 문제가 생기는 경우가 있어요. 컴파일 타임에 "이 기기는 리틀엔디언인가, 빅엔디언인가"를 알기 위해 C23에서 stdbit.h에 추가된 매크로 상수들이에요.
본문
이 세 상수는 모든 스칼라 타입의 엔디언을 나타냅니다.
문법
#include <stdbit.h>
#define __STDC_ENDIAN_LITTLE__ /* implementation-defined */ (1) (C23부터)
#define __STDC_ENDIAN_BIG__ /* implementation-defined */ (2) (C23부터)
#define __STDC_ENDIAN_NATIVE__ /* implementation-defined */ (3) (C23부터)
설명
- 모든 스칼라 타입이 리틀엔디언이면,
__STDC_ENDIAN_NATIVE__는__STDC_ENDIAN_LITTLE__과 같아요. - 모든 스칼라 타입이 빅엔디언이면,
__STDC_ENDIAN_NATIVE__는__STDC_ENDIAN_BIG__과 같습니다. - 플랫폼이 리틀엔디언도 빅엔디언도 아니면(혼합형 등),
__STDC_ENDIAN_NATIVE__는__STDC_ENDIAN_BIG__과도__STDC_ENDIAN_LITTLE__과도 같지 않아요. __STDC_ENDIAN_BIG__과__STDC_ENDIAN_LITTLE__의 정수 상수 표현식 값은 서로 같지 않습니다.
예시
__STDC_ENDIAN_NATIVE__를 switch로 비교해 현재 기기의 엔디언을 출력하는 예시예요.
#include <stdbit.h>
#include <stdio.h>
int main()
{
switch (__STDC_ENDIAN_NATIVE__)
{
case __STDC_ENDIAN_LITTLE__:
printf("__STDC_ENDIAN_LITTLE__\n");
break;
case __STDC_ENDIAN_BIG__:
printf("__STDC_ENDIAN_BIG__\n");
break;
default:
printf("mixed-endian\n");
}
return __STDC_ENDIAN_NATIVE__;
}
가능한 출력:
mixed-endian
case 라벨에 매크로 상수를 직접 비교하므로, #ifdef 같은 프리프로세서 분기 없이도 정수 상수 표현식으로 엔디언을 판별할 수 있어요.
더 알아보기
- 비트 조작 라이브러리 — 이 매크로들이 속한
<stdbit.h>(C23) 전체 목록. - cppreference의 endian 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.