如何区分宏函数和函数函数而没有任何歧义?

How the macro func and function func can be distinguished without any ambiguity?

本文关键字:函数 任何 歧义 何区      更新时间:2023-10-16
#include<iostream>
int func(int, int);
#define func(x,y) x/y+x
int main()
{
int i, j;
scanf("%d", &i);
scanf("%d", &j);
printf("%d ", func(i + j, 3));
printf("%dn", func(i + j, 3));
}
int func(int x, int y) {
return y / x + y;
}

应该向此代码中添加什么内容,以便第一个输出是宏的结果,第二个输出是函数的结果?

几种方式:

printf("%d ", func(i + j, 3)); // Macro call
#undef func // Macro is no longer defined
printf("%dn", func(i + j, 3)); // Function call

printf("%d ", func(i + j, 3)); // Macro call
printf("%dn", (func)(i + j, 3)); // Function call

另一种方式:

#define EMPTY
printf("%dn", func EMPTY (i + j, 3));

在 Boost.PP 中可以看到,EMPTY宏"烧毁"了扩展迭代,生成的func(...)保持不变。

一种解决方案是

printf("%dn", (&func)(i + j, 3));

(&func)获取函数的地址func。由于它没有形式func()因此没有进行宏替换。由于可以调用函数指针,因此行为符合预期。

相关文章: