C宏参数'存储'

时间:2010-02-20 21:59:16

标签: c macros

假设:

#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 必须是宏。它们捕获符号名称并对其进行操作。

4 个答案:

答案 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宏解决方案大致相同。

如果fg 必须是宏,那么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)

编辑:适用于未经修改的AB

的版本
#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;
}