>백엔드 개발 >C++ >C 열거형을 문자열로 쉽게 변환하고 Typedef 및 명명되지 않은 열거형을 처리하려면 어떻게 해야 합니까?

C 열거형을 문자열로 쉽게 변환하고 Typedef 및 명명되지 않은 열거형을 처리하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-15 21:05:32968검색

How Can I Easily Convert C   Enums to Strings, Handling Typedefs and Unnamed Enums?

문자열로의 간편한 C 열거형 변환

C 코드에서 명명된 열거형을 발견했다고 가정해 보겠습니다.

enum MyEnum {
      FOO,
      BAR = 0x50
};

그리고 각각에 대한 변환 기능을 갖춘 헤더를 생성하는 스크립트를 찾고 있습니다. enum:

char* enum_to_string(MyEnum t);

다음과 같이 간단한 구현을 사용하면

char* enum_to_string(MyEnum t){
      switch(t){
         case FOO:
            return "FOO";
         case BAR:
            return "BAR";
         default:
            return "INVALID ENUM";
      }
 }

그러나 형식 정의된 열거형과 이름이 지정되지 않은 C 열거형을 사용하면 상황이 까다로워집니다. 최고의 솔루션을 살펴보겠습니다.

X-Macros: The Champion

X-Macros는 우아한 솔루션을 제공하는 최고의 선택으로 등장합니다.

#include <iostream>

enum Colours {
#   define X(a) a,
#   include "colours.def"
#   undef X
    ColoursCount
};

char const* const colours_str[] = {
#   define X(a) #a,
#   include "colours.def"
#   undef X
    0
};

std::ostream&amp; operator<<(std::ostream&amp; os, enum Colours c)
{
    if (c >= ColoursCount || c < 0) return os << "???";
    return os << colours_str[c];
}

int main()
{
    std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl;
}

동봉파일 "colours.def" 보류:

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)

문자열 출력 사용자 정의

유연성을 더하기 위해 문자열 출력을 조정할 수 있습니다.

#define X(a, b) a,
#define X(a, b) b,

X(Red, "red")
X(Green, "green")
// etc.

위 내용은 C 열거형을 문자열로 쉽게 변환하고 Typedef 및 명명되지 않은 열거형을 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.