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 중국어 웹사이트의 기타 관련 기사를 참조하세요!