如何区分宏函数和函数函数而没有任何歧义?
How the macro func and function func can be distinguished without any ambiguity?
#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()
因此没有进行宏替换。由于可以调用函数指针,因此行为符合预期。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++模板函数,用于比较任何无符号整数和有符号整数
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- C++中是否有任何函数等同于python中字典的get函数?
- 用于检查值是否为其任何参数的帮助程序函数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 不执行任何操作的函数调用C++
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- 给定一个 3 x 3 矩阵或任何 n x n 矩阵,为什么我的以下函数找不到对角线差异?
- 接受任何 STL 容器的函数
- C++:单向跳转到函数.任何替代方案
- 从析构函数调用虚拟函数-任何解决方法