> 백엔드 개발 > C++ > `std::type_info`에서 잘못된 C 유형 이름을 어떻게 해독할 수 있나요?

`std::type_info`에서 잘못된 C 유형 이름을 어떻게 해독할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-12-27 20:25:10
원래의
240명이 탐색했습니다.

How Can I Demangle Mangled C   Type Names from `std::type_info`?

std::type_info에서 수수께끼의 이름 해독

C 영역에서 std::type_info는 클래스로 예시되는 엔터티 유형에 대한 중요한 통찰력을 제공합니다. 인스턴스 또는 함수. 그러나 이 유형 이름의 잘못된 표현으로 인해 실제 정체성이 모호해지는 경우가 많습니다. 예를 들어, typeid(std::Vector).name()은 "St6VectorIiSaIiEE"를 생성하여 기민한 정신이나 신비한 알고리즘으로만 해독할 수 있도록 렌더링합니다.

미스터리 풀기

길들이기 이 맹렬한 짐승에 대해 우리는 강력한 분해 능력을 활용하는 솔루션을 제시합니다. std::demangle은 기본 유형의 사람이 읽을 수 있는 형식을 공개하기 위한 강력한 도구입니다. 다음은 이 솔루션 사용에 대한 단계별 가이드입니다.

  1. type.hpp: 다음 선언으로 기본 헤더 파일을 설정합니다.
#include <string>
#include <typeinfo>

std::string demangle(const char* name);

template <class T>
std::string type(const T& t) {
    return demangle(typeid(t).name());
}
로그인 후 복사
  1. type.cpp(C 11): 효율적인 분해 작업을 위해 C 11 기능 활용:

    #ifdef __GNUG__
    #include <cstdlib>
    #include <memory>
    #include <cxxabi.h>
    
    std::string demangle(const char* name) {
    int status = -4;
    std::unique_ptr<char, void(*)(void*)> res {
    abi::__cxa_demangle(name, NULL, NULL, &status),
    std::free
    };
    
    return (status==0) ? res.get() : name ;
    }
    
    #else
    std::string demangle(const char* name) {
    return name;
    }
    #endif
    로그인 후 복사
  2. type.cpp (C 98): 시스템을 위한 대체 솔루션 제공 C11 없이 기능:

    #ifdef __GNUG__
    #include <cstdlib>
    #include <memory>
    #include <cxxabi.h>
    
    struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
    };
    
    std::string demangle(const char* name) {
    
    int status = -4; // some arbitrary value to eliminate the compiler warning
    
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );
    
    return (status==0) ? result.p : name ;
    }
    
    #else
    
    // does nothing if not g++
    std::string demangle(const char* name) {
    return name;
    }
    
    #endif
    로그인 후 복사
  3. 사용: 솔루션을 코드에 통합하여 사람이 읽을 수 있는 유형 이름을 쉽게 추출합니다.

    #include <iostream>
    #include "type.hpp"
    
    struct Base { virtual ~Base() {} };
    struct Derived : public Base { };
    
    int main() {
    Base* ptr_base = new Derived(); 
    std::cout << "Type of ptr_base: " << type(ptr_base) << std::endl;
    std::cout << "Type of pointee: " << type(*ptr_base) << std::endl;
    delete ptr_base;
    }
    로그인 후 복사

이 접근 방식을 활용하면 다음과 같은 결과가 출력됩니다. producer:

Type of ptr_base: Base*
Type of pointee: Derived
로그인 후 복사

호환성 및 주의사항:
제공된 솔루션은 g , clang 및 Mingw32를 포함한 다양한 플랫폼 및 컴파일러에서 테스트되었습니다. 주로 g 를 대상으로 하지만 C 98 버전은 g가 아닌 시스템에서도 사용할 수 있습니다. 이에 따라 공급업체별 API가 다를 수 있다는 점에 유의해야 합니다.

결론적으로, 이 분해 솔루션을 사용하면 std::type_info에서 사람이 읽을 수 있는 유형 이름을 쉽게 추출할 수 있어 변형된 표현과 관련된 모호성을 제거할 수 있습니다. 제공된 코드 조각을 활용하면 이 기능을 프로젝트에 원활하게 통합하여 명확하고 쉽게 디버깅 및 로깅 기능을 향상시킬 수 있습니다.

위 내용은 `std::type_info`에서 잘못된 C 유형 이름을 어떻게 해독할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿