`__STDC_ENDIAN_LITTLE__`, `__STDC_ENDIAN_BIG__`, `__STDC_ENDIAN_NATIVE__` — 엔디언 매크로

__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_BIG__, __STDC_ENDIAN_NATIVE__ — 엔디언 매크로 (C23)

프로그램을 다른 기기로 옮겨서 돌리다 보면, 메모리에서 바이트가 저장되는 순서, 즉 엔디언(endianness)이 달라 문제가 생기는 경우가 있어요. 컴파일 타임에 "이 기기는 리틀엔디언인가, 빅엔디언인가"를 알기 위해 C23에서 stdbit.h에 추가된 매크로 상수들이에요.

출처: cppreference — endian

본문

이 세 상수는 모든 스칼라 타입의 엔디언을 나타냅니다.

문법

#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 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.