c - __typeof__ 宏扩展为函数名

标签 c macros posix c-preprocessor typeof

我用纯 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 在编译时进行评估,据我了解,只有当宏包含在直接涉及 stringify # 的第二个宏中时,才会阻止对其进行评估。和串联 ## token (这就是为什么我按照你看到的方式拆分 cat 的原因)。如果这是正确的,为什么不__typeof__(x)被预处理器评估为加倍?在我看来,这种行为在构建时应该是非常清楚的。不应该__typeof__(x)评估为 double在进入之前 _cat

我找了又找,但我找不到任何东西……我是不是在做一些非常非常愚蠢的事情?

我正在运行 Mac OS X Mountain Lion,但我最感兴趣的是让它在任何 POSIX 平台上运行。

最佳答案

这不起作用的原因是 typeof 不是宏,而是 gcc 的 C 方言中的保留字,因此在预处理器完成其工作后 进行处理.一个很好的类比是 sizeof 运算符,它也不是宏,也不会被预处理器扩展。要(大致)做你想做的事(根据参数类型选择不同的函数)尝试 _Generic 构造(C11 中的新功能)

关于c - __typeof__ 宏扩展为函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17893131/

相关文章:

C 宏传递数字而不是变量

php - Windows 上的 Posix 和国际扩展

c - TTF_OpenFont 第 N 次尝试失败

c - i++ 不在 while 循环内工作

c - 在 PPC 上的 Montavista 上用 C 语言生成 float

c - 如何暂停使用 CreateTimerQueueTimer 创建的计时器

macros - 评估宏形式的参数

c - 编写一个接受可变参数并返回一个值的 C 宏

swift - 使用索引访问元组(由 libc 定义)

c - C中读写锁的线程安全销毁