2010-02-20 67 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