C C 輸出變數型別的方法討論

2021-10-08 07:39:35 字數 3506 閱讀 5093

對於簡單的變數型別,我們可以通過typeid().name()來輸出

#include

#include

//所需標頭檔案

using

namespace std;

intmain()

執行上述程式,您將會得到以下結果:b c i f d l

其含義為對應變數型別的簡寫。但是這種方式只適用於基礎變數型別,當遇到結構體容器介面卡(eg. vector)時,將產生不易理解的結果,例如下述程式所示:

#include

#include

#include

#include

#include

using

namespace std;

intmain()

;struct

student[10]

;//匿名結構體陣列

string str =

"mr_xzz"

; stack<

int> stacktest;

vectorfloat

>

> vectest;

cout<<

typeid

(color)

.name()

typeid

(student)

.name()

typeid

(str)

.name()

typeid

(stacktest)

.name()

typeid

(vectest)

.name()

}

執行上述程式,您將會得到以下結果:

z4maine5color

a10_z4maineut_

ss

st5stackiist5dequeiisaiieee

st6vectoris_ifsaifeesais1_ee

關於typeid().name()輸出的格式為[指標][命名空間][類別][模板]

[指標]:若是指標則輸出p。

[命名空間]:若是std則輸出st,若是自定義的命名空間則輸出字元數及它的名字,並在開頭加n,在結尾加e。

[類別]:若是自定義的命名空間則輸出字元數及它的名字

[模板]:型別模板以i開頭,以e結尾;常數模板以l開頭,以e結尾。只有整型變數(int、char之類的)才能做為常數模板,浮點數不行。

引用自:

這裡看不懂沒關係,總之這說明gcc的輸出是經過修飾的,而如果您用的是vc的編譯環境,則不會出現上述修飾,直接返回完整型別名稱,為了去掉gcc的修飾,可以使用__cxa_demangle 。

其核心**為:

#include

// 所需標頭檔案

char

* realname = abi::

__cxa_demangle

(typeid

(color)

.name()

,nullptr

,nullptr

,nullptr

);

仍然用之前的資料型別,這次使用__cxa_demangle,對比輸出效果

#include

#include

#include

#include

#include

#include

#include

// 所需標頭檔案

using

namespace std;

intmain()

;struct

student[10]

; string str =

"mr_xzz"

; stack<

int> stacktest;

vectorfloat

>

> vectest;

// char* realname = abi::__cxa_demangle(typeid(color).name(), nullptr, nullptr, nullptr);

cout<<

typeid

(color)

.name()

<<

" => "

<__cxa_demangle

(typeid

(color)

.name()

,null

,null

,null

)

typeid

(student)

.name()

<<

" => "

<__cxa_demangle

(typeid

(student)

.name()

,null

,null

,null

)

typeid

(str)

.name()

<<

" => "

<__cxa_demangle

(typeid

(str)

.name()

,null

,null

,null

)

typeid

(stacktest)

.name()

<<

" => "

<__cxa_demangle

(typeid

(stacktest)

.name()

,null

,null

,null

)

typeid

(vectest)

.name()

<<

" => "

<__cxa_demangle

(typeid

(vectest)

.name()

,null

,null

,null

)

}

執行上述程式,可得結果如下:

__cxa_demangle可以實現複雜型別的直觀輸出。

C C ,判斷變數的型別

python用久了,c c 也就慢慢還給老師了 在python中,利用type 函式,可以很方便的判斷變數型別。但是在c c 中,判斷變數型別,卻不簡單 c 中,可以利用typeid 來判斷變數型別。第一步 建立test.cpp檔案,輸入以下 include includeusing namespa...

C C 中變數的儲存型別

變數可能存放在三個位置 普通記憶體 靜態儲存區 程式執行堆疊 硬體暫存器。在函式體外定義的和在函式體內定義的並宣告為static型別的儲存在靜態儲存區中,在程式執行之前建立,在程式退出後銷毀。在函式體內定義的預設為 auto 自動變數,儲存在堆疊中,函式返回後,這些變數被銷毀。關鍵字register...

關於變數資料型別的幾點討論 一

variant 變數的格式有 ole定義,可以存放任何型別的資料,並以下圖的格式用 16個位元組存放某些變數。0 12 78 15 vartype unused value 第 0和1位元組儲存乙個整數值,以指明在第 8 15 位元組中存放的是何種型別的資料,第2到 7位元組一般情況下沒有用,並且在...