2013-05-31 38 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'将无法正确工作指针类型。 –