2013-06-29 36 views
0

我想要一個宏,它可以將一個變量的類型與另一個標記合併以創建一個新的標記。隨機例如:帶有標記的變量的合併類型

int var; 
int make_token(var); 

這將成爲:

int var; 
int var_int; 

我試着來定義,像這樣的宏:

#define make_token(x) x ## _ ## typeof(x) 

但是,整個事情被擴展爲:

int var; 
int var_typeof(var) 

有沒有辦法實現這個機智HOUT必須在宏的參數中傳遞變量的類型?

+2

我不這麼認爲。預處理器幾乎不知道語言本身。 –

+0

我相信你可以用雙宏來做。 '#define type_macro(x)typeof(x)''#define make_token(x)x ## _ ## type_macro(x)'。嘗試一下,但不要聽我說,它的工作原理。 –

+0

我發現術語'令牌'令人困惑,並且更喜歡'標識符'。 –

回答

3

由於typeof是在預處理後的編譯後期階段確定的,所以這是不可能的。

另外typeof不擴展爲類型標識符;它不適用於文本/代碼級別,而是在語義級別。這是編譯器解釋並用於確定其內部數據結構類型的關鍵字。

你可以做的唯一一件事就是類型添加到宏:

#define TYPED_VARIABLE(type, identifier) type identifier ## _ ## type 

然而,作爲一個聰明人日前表示:「使用匈牙利表示法是沒有頭腦的是一個巨大的錯誤,所以不要做吧!「我完全同意。

+1

+1爲正確的想法。不過,你使用的詞彙令人不安。預處理器根據定義(實際上對於大多數編譯器而言)只是編譯期間的一個階段,而不是在「編譯之前」運行。 –

+0

那麼'編譯時'包含預處理?我不這麼認爲:編譯時我們主要是指語義分析和處理。 [另外,預處理器是編譯器調用的單獨程序。](http://en.wikipedia.org/wiki/C_preprocessor)。 –

+1

如果你可以補充一點,我會加倍努力的,「但是使用匈牙利符號是沒有意義的,是一個巨大的錯誤,所以不要這樣做」。 – 2013-06-29 15:25:43

0

您需要爲每個要定義的類型設置一個宏。