使用typeof将变量声明转换为类型?

时间:2013-05-31 16:20:45

标签: c gcc c-preprocessor 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 ??)

或者,我应该在这里使用另一种表达方式吗?

2 个答案:

答案 0 :(得分:0)

好吧,我找到了一种方法,使用另一个GCC扩展,这次是语句表达式:

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

当然,这扩展到:

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

非常难看,但为什么我在意呢?它有效。

答案 1 :(得分: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;
}