我用普通的 C 编写了以下代码:
#define _cat(A, B) A ## _ ## B
#define cat(A, B) _cat(A, B)
#define plus(A, B) cat(cat(plus,__typeof__(A)),__typeof__(B))(A, B)
int main(int argc, const char * argv[])
{
double x = 1, y = 0.5;
double r = plus(x, y);
printf("%lf",r);
return 0;
}
在这里,我希望将宏
plus
扩展为包含参数类型的函数名称。在此示例中,我希望它扩展以下方式double r = plus(x, y)
...
/* First becomes*/
double r = cat(cat(plus,double),double)(x, y)
...
/* Then */
double r = cat(plus_double,double)(x, y)
...
/* And finally */
double r = plus_double_double(x, y)
但是我从预处理器得到的只是
double r = plus___typeof__(x)___typeof(y)(x,y)
而gcc显然会拒绝编译。
现在,我知道的类型在编译时进行评估,并且我的理解是,仅当宏包含在直接涉及stringify
#
和串联##
token 的第二个宏中时,才阻止对宏进行评估。我以您看到的方式分割了cat
)。如果这是正确的,为什么预处理器不将__typeof__(x)
评估为加倍?在我看来,行为应在构建时完全清楚。甚至在输入__typeof__(x)
之前,double
是否应该不对_cat
求值?我搜寻了一下,但找不到任何东西……我是不是真的在做些愚蠢的事情?
我正在运行Mac OS X Mountain Lion,但我最感兴趣的是使其能够在任何POSIX平台上运行。
最佳答案
这不起作用的原因是类型不是宏,而是gcc的C语言中的保留字,因此在预处理器完成其工作之后进行处理。一个很好的类比是sizeof运算符,它也不是宏,也不会被预处理器扩展。要(大约)执行您想要的操作(根据参数的类型选择其他函数),请尝试_Generic构造(C11中的新增功能)
关于c - 将__typeof__宏扩展为函数名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17893131/