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"이라는 프로세스를 적용해야 합니다. ." 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!