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

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

Susan Sarandon
풀어 주다: 2024-12-05 05:22:14
원래의
119명이 탐색했습니다.

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

GCC의 typeid.name() 특징

typeid.name() 함수는 변수 유형에 대한 정보를 얻는 데 자주 사용됩니다. 또는 표현. 그러나 GCC로 컴파일할 때 이 함수는 예상했던 수정된 유형 이름 대신 겉보기에 무의미해 보이는 문자를 반환하는 것으로 관찰되었습니다. 이 동작은 더 명확한 표현을 제공하는 Visual C와 같은 다른 컴파일러와 대조됩니다.

불일치의 원인

불일치의 원인은 typeid 구현에 있습니다. name()은 컴파일러의 구현에 의해 정의됩니다. 예를 들어 GCC는 생성자 및 소멸자의 이름 및 서명과 같은 유형에 대한 추가 정보가 포함된 장식된 이름을 반환합니다.

장식된 이름 디맹글링

데코레이팅된 문자열에서 더 읽기 쉬운 유형 이름을 얻으려면 c filt 또는 __cxa_demangle과 같은 도구를 사용할 수 있습니다. 이러한 도구는 데코레이팅된 이름을 "해체"하여 추가 정보를 제거하고 난해하지 않은 유형 이름만 남깁니다.

예: c filt를 사용한 디맹글링

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << c++filt::demangle(typeid(Blah).name()) << endl;
  return 0;
}
로그인 후 복사

이 수정된 코드를 컴파일하고 실행하면 원하는 결과를 얻을 수 있습니다. 출력:

struct Blah
로그인 후 복사

결론

GCC의 typeid.name() 함수는 처음에 장식된 유형 이름을 반환하지만 이를 분해하여 손상되지 않은 유형을 얻을 수 있습니다. c filt 또는 __cxa_demangle과 같은 도구를 사용하여 이름을 지정합니다. typeid.name()의 구현 정의 특성을 이해하면 C 코드에서 원하는 유형 정보를 효과적으로 검색할 수 있습니다.

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

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