首頁 >後端開發 >C++ >為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?

為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?

DDD
DDD原創
2024-11-30 14:59:11571瀏覽

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 <p>使用 GCC 編譯時,程式碼輸出「4Blah」而不是預期的「Blah」。這是因為 GCC 在名稱中附加了與類型相關的信息,例如參數和大小。 </p>
<h3> 拆解修飾名稱</h3>
<p> 要獲得未拆解的名稱,我們需要應用一個稱為「拆解」的過程」。GCC 為此提供了__cxa_demangle() 函數,以及命令列工具c filt。 demangle:</p>
<p></p>編譯時使用GCC,此程式碼現在將輸出“Blah”,如下所示<pre class="brush:php;toolbar:false">#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 <p>結論</p>
<h3>雖然typeid.name() 是在C中獲取類型資訊的一個有價值的工具,但了解GCC如何處理類型名稱至關重要。</h3></typeinfo></iostream>

以上是為什麼 GCC 的 `typeid.name()` 會傳回奇怪的類型名稱,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn