0

目前,我有一个很像这样的场景:

#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 ??)

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

4

2 回答 2

0

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

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

当然,它扩展到:

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

很丑,但我为什么在乎?有用。

于 2013-05-31T16:38:10.117 回答
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;
}
于 2013-05-31T17:00:26.457 回答