2010-02-20 65 views
5

考虑:C代码宏参数 '存储设备'

#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

工作的版本,请提供合适的例子,显示你真正想要的东西。 – 2010-02-20 22:27:46

回答

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; 
} 
+0

这是巧妙的。 任何懂得的人都会赞成这个答案。 – anon 2010-02-21 03:51:26

+0

为什么额外的间接? '#定义应用(a,b)a(b)'也同样适用。 – 2010-02-21 04:13:33

+0

@Chris,它不会那样工作。我忘记了确切的拉森,但MSVC肯定会抱怨它。 – MSN 2010-02-21 05:39:27

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 

如果你使用的是C编译器,支持非标准inline指令,可以消除函数调用的开销。如果您使用的是C++,那么它的工作原理与您预期的C宏解决方案大致相同。

如果fg必须是宏,没有任何方式与C预处理程序来传递多个参数传递给宏没有出现在现场调用一个实际的逗号。为了做到这一点,你必须在C预处理器上添加预处理器级别以上的

+0

很好的解决方案。此外,即使没有inline指令,只要您在函数上使用静态指令,优化编译器可能会自动内联。 – 2010-02-20 22:19:50

+0

“非标准内联指令”。对于这个问题,如果它支持标准的话,它可能会内联这样简单的事情。我们知道提问者使用C99,因为他的主函数没有返回语句,但大概是打算有定义的行为;-) – 2010-02-20 23:54:11

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; 
} 
+1

问题是关于C,不是吗? – 2010-02-20 23:55:30

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++模式下都是如此。

+0

Thx整理出来:) – mre 2010-02-20 22:28:48