假设:
#define f(x, y) (x+y)
#define g(x, y) (x*y)
#define A 1, 2
#define B 2, 3
int main() {
int a = f(A);
int b = g(A);
int c = f(B);
int d = g(B);
}
哪个不起作用,
我怎样才能让它发挥作用?基本的想法是我有一个参数列表,我想传递给两个不同的宏,而不是每次都重复长参数列表。
有办法做到这一点吗? [欢迎您修改f& G;你甚至欢迎修改A&我称之为宏的方式。唯一的要求是: 1)arguemnt列表只能出现一次 2)它不能被硬编码......所以我可以用不同的参数调用宏
如果你的解决方案不起作用,但“几乎可以工作”(对于你的定义差不多),我也想听听它,也许我可以捏造它去工作。
谢谢!
编辑:f& g 必须是宏。它们捕获符号名称并对其进行操作。
答案 0 :(得分:4)
你可以这样做:
static int f(int x, int y) { return (x+y); }
static int g(int x, int y) { return (x*y); }
#define A 1, 2
#define B 2, 3
如果您使用的是支持非标准inline
指令的C编译器,则可以消除函数调用的开销。如果您使用的是C ++,
template<T> T f(T x, T y) { return (x+y); }
template<T> t g(T x, T y) { return (x*y); }
#define A 1, 2
#define B 2, 3
与预期的C宏解决方案大致相同。
如果f
和g
必须是宏,那么C预处理器没有任何方法可以将多个参数传递给宏,而不会出现实际的逗号调用网站。为此,您必须在C预处理器上方添加预处理器级别 。
答案 1 :(得分:4)
如果您使用的是C99,可以使用compound initialiser syntax通过将多个参数作为单个数组传递来执行此操作:
#define f(a) (a[0]+a[1])
#define g(a) (a[0]*a[1])
#define A ((int[]) {1, 2})
#define B ((int[]) {2, 3})
GCC在C89和C ++模式下都支持这种复合文字语法。
答案 2 :(得分:3)
编辑:适用于未经修改的A
和B
#define f(x, y) (x+y)
#define g(x, y) (x*y)
#define A 1, 2
#define B 2, 3
#define APPLY2(a, b) a b
#define APPLY(a, b) APPLY2(a, (b))
int main(int argc, char* argv[])
{
int x= APPLY(f, A);
int y= APPLY(f, B);
int z= APPLY(g, A);
int d= APPLY(g, B);
return 0;
}
答案 3 :(得分:0)
也许这就是你想要的:
#include<iostream>
using namespace std;
#define A 1, 2
template <typename T>
inline T f(T a, T b) { return a + b; }
int main()
{
cout << f(A) << endl;
return 0;
}