我用纯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 显然会拒绝编译。现在,我知道typeof#
在编译时进行评估,并且我的理解是,只有当宏包含在直接涉及字符串化和连接标记的第二个宏中时,才会阻止对宏进行评估(这就是我拆分的##
原因cat
你看到的方式)。如果这是正确的,为什么不__typeof__(x)
被预处理器评估为加倍?在我看来,行为在构建时应该非常清楚。进去之前不应该__typeof__(x)
评估吗?double
_cat
我搜了又搜,但我找不到任何东西......我在做一些非常愚蠢的事情吗?
我正在运行 Mac OS X Mountain Lion,但我最感兴趣的是让它在任何 POSIX 平台上运行。