> 백엔드 개발 > C++ > C에서 기본 유형을 표시하기 위해 std::type_info::name을 어떻게 분해할 수 있습니까?

C에서 기본 유형을 표시하기 위해 std::type_info::name을 어떻게 분해할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-10 11:38:11
원래의
385명이 탐색했습니다.

How can I demangle std::type_info::name to reveal the underlying type in C  ?

std::type_info::name에 대한 De-Mangler: 신비한 이름 공개

std::type_info에 의해 훼손된 이름은 여전히 ​​수수께끼로 남아 있습니다 , 기본 유형을 이해하기 어렵게 만듭니다. 이 수수께끼를 풀 수 있는 솔루션에 대한 탐구는 다양한 접근 방식의 탐구로 이어졌습니다.

Mangled Name 해체

하나의 솔루션은 C 11의 강력한 기능과 G' abi::__cxa_demangle 함수를 통한 libstdc 라이브러리. 이 함수는 손상된 이름을 디코딩하여 사람이 읽을 수 있는 문자열을 반환합니다.

C 11 구현

C 11 구현에서 demangle 함수는 "type .hpp" 헤더 파일이며 실제 디맹글링 논리는 "type.cpp"에 있습니다. 다음 코드 조각은 다음을 보여줍니다.

#include "type.hpp"

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 ;
}
로그인 후 복사

C 98 호환 버전

C 11을 사용하지 않는 사용자의 경우 대안이 남아 있습니다. "type.cpp"의 C 98 호환 구현은 이름을 제거하기 위해 다른 기술을 사용합니다.

#include "type.hpp"

struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
};

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

    int status = -4; 
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );

    return (status==0) ? result.p : name ;
}
로그인 후 복사

사용 및 고려 사항

깨진 이름을 검색할 수 있습니다. demangle할 유형에 대한 참조를 허용하는 type 함수를 사용합니다. 다음 코드는 사용법을 보여줍니다.

#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;
}
로그인 후 복사

결론

이러한 기술을 통해 개발자는 이제 변조된 유형 이름의 숨겨진 ID를 밝혀내고 코드와 관련된 유형.

위 내용은 C에서 기본 유형을 표시하기 위해 std::type_info::name을 어떻게 분해할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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