2009-05-06 58 views
6

有時我需要在使用C或C++進行編程時學習表達式的類型。有時候有一個好的IDE或者現有的文檔可以幫助我,但有時候不會。我經常覺得這樣的構造可能是有用的:確定表達式的類型

void (*myFunc)(int); 
printf("%s", nameoftype(myFunc)); //"void (*)(int)" 
int i, unsigned int u; 
printf("%s", nameoftype(i+u)); //"unsigned int" 

這對於C++尤其如此;認爲const對象的訪問器 - 它們是否返回一個const引用或一個副本?認爲動態演員和模板班。

我該怎麼做? (即學習表達式的類型)

我使用GCC,但據我所知,它沒有這樣的擴展名。所以我想我很好奇人們如何解決這個問題。 (歡迎編譯時和運行時解決方案。)

回答

1

你在找什麼?自動類型推斷或尋找類型,以便您可以手動正確地聲明變量? (你自己的答案看起來像你想要第二個)。在這種情況下,可以考慮使用Geordi

<litb> make type pointer to function taking pointer to array of 10 int returning void 
<geordi> void (*)(int (*)[10]) 

<litb> geordi: { int a = -1; unsigned int b = 0; cout << ETYPE(a + b), ETYPE_DESC(a + b), (a + b); } 
<geordi> rvalue unsigned int, rvalue unsigned integer, 4294967295 

<litb> geordi: << TYPE_DESC(void (*)(int (*)[10])) 
<geordi> pointer to a function taking a pointer to an array of 10 integers and returning nothing 

自動類型推斷,目前不可能不使用輔助庫,例如boost.typeof,將使用編譯器的擴展名如__typeof__爲GCC。接下來,C++將獲得auto(與當前的auto不同的語義),並且將能夠與decltype一起獲得表達式的類型。如果youare使用G ++這是mangeled名

template<typename T> void f(T t) { /* ... */ } 
int main() { int a = -1; unsigned int b = 0; f(a + b); } 
2

C++有一個typeid運算符;

typeid(expression).name() 

將返回一個實現定義的表達式類型的名稱。唉,它通常是不可讀的。

+3

如果你能走出本地環境的生活,你總是可以創建一個函數模板這樣。然後你可以使用命令行工具'C++ filt'去除它。 – 2009-05-06 14:43:05

+0

啊,我從來沒有用過C++ filt。我會研究它,謝謝。 – aib 2009-05-07 23:53:00

+0

目前不推薦使用這種方法,在某些情況下應該考慮棄用。它的原因雖然它打印類型,類型輸出是繁瑣的。此外有時它打印無效類型!具體的例子在新的「有效的現代C++」第1章第4項中有明確的解釋。 – likern 2015-01-21 11:57:37

13

有時候,我只是做:

int ***a = expression; 

,並尋找「<表達式類型>不能被分配到指針到^ 3 INT」的錯誤。這似乎是最便攜的解決方法。

+1

一些較早的C編譯器實際上會允許這樣做。 :-( – 2009-05-06 14:10:48