2013-05-31 30 views
0

目前,我有一種情況就像這樣:使用typeof將變量聲明轉換爲類型?

#define my_macro(var) __builtin_types_compatible_p(typeof(var), foo) ? do_something : do_something_else 

然而,不經意間宏被傳遞此參數:

my_macro(int x); 

這當然失敗了,因爲typeof(int x)無效。

有沒有可以在my_macro內部應用的轉換,這將允許typeof在該表達式上工作?我不能改變傳入宏的內容,只能在宏內發生。

所以,這樣的事情:

#define my_macro(var) typeof(?? var ??) 

或者,有沒有我應該在這裏使用的另一種表現?

+1

我會說「不「,雖然顯然負面的是有點難以證明;) –

+0

@OliCharlesworth我擔心......我知道我可以用'decltype'來做,但我真的很想在這裏避免使用C++。 –

回答

0

好吧,我發現了一個辦法做到這一點,使用另一個GCC的擴展,這一次的聲明中表示:

#define my_typeof(definition) typeof(({ definition, _def; _def; })) 

其中,當然,擴展爲:

typeof(({ int x, _def; _def; })) 

很醜陋,但爲什麼我在乎呢?有用。

+0

注意這將無法正確工作指針類型... –

+0

@OliCharlesworth良好的捕獲。看看是否存在可以用於指針的解決方案會很有趣。 –

0

您可以分別處理xint x,但要處理兩個宏都需要在C預處​​理器中解析/分離空格分隔的參數。據我所知,C預處理器中不存在這樣的支持。如果沒有這樣的解析功能,你必須找到一些其他的聰明的方式來寫這個限制的作品,例如,事中的my_macro2()下面的代碼樣本中的精神宏:

#include <stdio.h> 

#define my_macro1(var) \ 
do { \ 
    typeof(var) blah; \ 
    printf("sizeof(var)=%d\n", sizeof(blah)); \ 
} while(0) 

#define my_macro2(var) \ 
do { \ 
    var, newvar_sametype; \ 
    typeof(newvar_sametype) blah; \ 
    printf("sizeof(newvar_sametype)=%d\n", sizeof(blah)); \ 
} while(0) 


int 
main() 
{ 
    int x; 
    my_macro1(x); 
    my_macro2(char y); 

    return 0; 
} 
+0

這是非常整潔,但請注意''my_macro2'將無法正確工作指針類型。 –