目前,我的情况非常类似:
#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 ??)
或者,我应该在这里使用另一种表达方式吗?
答案 0 :(得分:0)
好吧,我找到了一种方法,使用另一个GCC扩展,这次是语句表达式:
#define my_typeof(definition) typeof(({ definition, _def; _def; }))
当然,这扩展到:
typeof(({ int x, _def; _def; }))
非常难看,但为什么我在意呢?它有效。
答案 1 :(得分:0)
您可以单独处理x
或int 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;
}