>백엔드 개발 >C++ >`typeid.name()`이 GCC에서 다른 출력을 생성하는 이유는 무엇이며 어떻게 해독할 수 있습니까?

`typeid.name()`이 GCC에서 다른 출력을 생성하는 이유는 무엇이며 어떻게 해독할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-21 07:20:10383검색

Why Does `typeid.name()` Produce Different Output in GCC and How Can I Demangle It?

GCC의 Typeid.name() 동작 및 디맹글링 기술

typeid 연산자를 사용할 때 개발자는 typeid 출력에 차이가 있습니다. name()은 사용된 컴파일러에 따라 다릅니다. 이 기사에서는 GCC에서 이런 일이 발생하는 이유와 문제가 해결된 형식 이름을 인쇄하는 문제를 해결하는 방법을 살펴봅니다.

GCC 대 Visual C: 형식 이름 표시

예제에서 제공된 경우 GCC(버전 4.4.4)는 typeid(Blah).name()을 호출할 때 "4Blah"를 반환하는 반면 Visual C 2008에서는 "struct Blah"를 표시합니다. 이러한 불일치는 GCC가 장식된 유형 이름을 반환하기 때문에 발생합니다.

GCC의 장식된 유형 이름

typeid 연산자의 구현은 균일하게 정의되지 않습니다. GCC의 경우 유형의 크기 및 정렬과 같은 추가 정보가 포함된 장식된 유형 이름을 반환합니다.

Unmangling Decorated Names

잘못된 유형을 검색하려면 이름을 입력하면 사용자는 데코레이팅된 이름을 해독해야 합니다. 이는 다양한 도구를 사용하여 수행할 수 있습니다:

  • c filt 명령: 장식된 이름을 제거하는 명령줄 유틸리티.
  • __cxa_demangle() 함수 : Demangling을 수행하는 C 함수입니다.

Demangling 적용

GCC에서는 다음 명령을 실행하여 장식된 이름 "4Blah"를 demangle할 수 있습니다. :

g++ -fno-rtti -no-pie -o main main.cpp
./main | c++filt

이 명령은 "struct Blah"를 demangled 유형 이름으로 인쇄합니다. __cxa_demangle() 함수를 코드에 통합하는 것도 데코레이팅된 이름을 프로그래밍 방식으로 분해하기 위한 옵션입니다.

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

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