>백엔드 개발 >C++ >GCC의 `typeid.name()`이 이상한 유형 이름을 반환하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

GCC의 `typeid.name()`이 이상한 유형 이름을 반환하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

DDD
DDD원래의
2024-11-30 14:59:11440검색

Why Does GCC's `typeid.name()` Return Weird Type Names, and How Can I Fix It?

typeid.name()을 사용하여 GCC의 이상한 유형 이름 출력 이해하기

C에서 유형 정보로 작업할 때 typeid.name()은 유형의 이름. 그러나 GCC를 사용하면 개발자는 출력에서 ​​난해한 문자를 발견하게 됩니다. 이 기사에서는 이러한 동작의 이유를 자세히 알아보고 문제가 없는 유형 이름을 얻는 방법을 탐구합니다.

장식된 이름의 미스터리

기본적으로 GCC는 유형에 대해 다음을 포함하는 "장식된 이름"을 반환합니다. 추가 정보이며 사람이 읽을 수 없습니다. 이는 제공된 코드 조각에 예시되어 있습니다.

#include <iostream>
#include <typeinfo>

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}

GCC로 컴파일할 때 코드는 예상되는 "Blah" 대신 "4Blah"를 출력합니다. 이는 GCC가 이름에 매개변수, 크기 등 유형 관련 정보를 추가했기 때문입니다.

Demangling Decorated Names

잘못된 이름을 얻으려면 "demangling"이라는 프로세스를 적용해야 합니다. ." GCC는 이러한 목적을 위해 __cxa_demangle() 함수와 명령줄 도구인 c filt를 제공합니다.

다음 코드는 장식된 이름을 demangle하는 방법을 보여줍니다.

#include <iostream>
#include <typeinfo>

int main() {
  const char* decorated_name = typeid(Blah).name();
  char* unmangled_name = abi::__cxa_demangle(decorated_name, nullptr, nullptr, nullptr); // Windows: _ZNKSt7__cxxabiv117__class_type_info9can_catchEPv
  if (unmangled_name) {
    cout << unmangled_name << endl;
    free(unmangled_name);
  } else {
    cout << "Demangling failed" << endl;
  }  
  return 0;
}

컴파일할 때 GCC를 사용하면 이 코드는 이제 다음과 같이 "Blah"를 출력합니다. 예상됩니다.

결론

typeid.name()은 C에서 유형 정보를 얻는 데 유용한 도구이지만 GCC가 유형 이름을 어떻게 변경하는지 이해하는 것이 중요합니다. 위에 설명된 디맹글링 기술을 활용하여 개발자는 사람이 읽을 수 있는 유형 이름을 추출하여 디버깅 및 분석을 단순화할 수 있습니다.

위 내용은 GCC의 `typeid.name()`이 이상한 유형 이름을 반환하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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