C에서 열거형은 명명된 상수 집합을 나타내는 편리한 방법을 제공합니다. 그러나 열거형 값을 인쇄할 때 기본 동작은 숫자 표현을 표시하는 것입니다.
다음과 같은 열거형이 있다고 가정해 보겠습니다.
enum Errors { ErrorA = 0, ErrorB, ErrorC, };
다음을 사용하여 열거형 값을 인쇄하려고 하면 std::cout:
Errors anError = ErrorA; std::cout << anError; // 0 will be printed
텍스트 표현 "ErrorA" 대신 숫자 값 0을 얻습니다. 이 문제는 std::cout에 열거형을 문자열로 변환하는 기본 지원이 부족하기 때문에 발생합니다.
1. 맵 사용
한 가지 접근 방식은 각 열거형 값을 해당 텍스트 표현과 연결하는 맵을 만드는 것입니다.
#include <map> #include <string_view> std::ostream& operator<<(std::ostream& out, const Errors value) { static const auto strings = [] { std::map<Errors, std::string_view> result; #define INSERT_ELEMENT(p) result.emplace(p, #p); INSERT_ELEMENT(ErrorA); INSERT_ELEMENT(ErrorB); INSERT_ELEMENT(ErrorC); #undef INSERT_ELEMENT return result; }; return out << strings[value]; }
2. 선형 검색과 함께 구조 배열 사용
또 다른 옵션은 각각 열거형 값과 해당 텍스트 표현을 포함하는 구조 배열을 사용한 다음 선형 검색을 수행하는 것입니다.
#include <string_view> std::ostream& operator<<(std::ostream& out, const Errors value) { #define MAPENTRY(p) {p, #p} const struct MapEntry { Errors value; std::string_view str; } entries[] = { MAPENTRY(ErrorA), MAPENTRY(ErrorB), MAPENTRY(ErrorC), {ErrorA, 0} //doesn't matter what is used instead of ErrorA here... }; #undef MAPENTRY const char* s = 0; for (const MapEntry* i = entries; i->str; i++) { if (i->value == value) { s = i->str; break; } } return out << s; }
3. switch/case 사용
마지막으로 switch/case 문을 사용할 수도 있습니다:
#include <string> std::ostream& operator<<(std::ostream& out, const Errors value) { return out << [value] { #define PROCESS_VAL(p) case(p): return #p; switch(value) { PROCESS_VAL(ErrorA); PROCESS_VAL(ErrorB); PROCESS_VAL(ErrorC); } #undef PROCESS_VAL }; }
솔루션 테스트:
이러한 솔루션을 테스트하기 위해 다음을 사용하여 실행 파일을 만들 수 있습니다. 코드:
#include <iostream> int main(int argc, char** argv) { std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl; return 0; }
이 실행 파일을 실행하면 열거형 값의 텍스트 표현이 출력됩니다.
ErrorA ErrorB ErrorC
위 내용은 if/switch 문을 사용하지 않고 C 열거형 값을 텍스트로 인쇄하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!