2009-10-29 107 views
2

問題的背景:
void dash(int *n, char c)是繪製由'+'分隔的字符c。
參數n是一個整數的數組,例如, {1,3,2}和' - '爲c應該給「+ - + --- + - +」,這很好。 要使用短劃線我做{int f={1, 3, 2}; dash(f, '-');},這使得構建副本&可以讀取。

這個問題本身:
要避免複製粘貼&我想做#define F(X, Y) {int f=X; dash(f, Y);}, 產生了很好的使用F({1, 3, 2}, '-')
不幸的是編譯器抱怨F獲得4(數組長度+1)的參數而不是2.

那麼如何將{1, 3, 2}作爲參數給宏呢?通過宏C初始化數組

+1

目前還不清楚'破折號'如何確定陣列中有多少元素。總是有3個? – 2009-10-29 15:45:36

+0

我已經實現了它在最後一個元素處停止,它必須是0.但是這對於問題本身並不重要,所以我把它留在這裏。 – 2009-10-31 12:14:56

回答

4

Variadic宏是C99的一個功能。

#define F(Y,...) dash((int[]){__VA_ARGS__},Y) 

所以你怎麼能給予{1,3,2}作爲 參數宏?

F('-',1,3,2); 
+0

我認爲應該是 #define F(Y,...)dash((int []){__ VA_ARGS__},Y} 注意(int [])強制轉換並丟失分號。 – quinmars 2009-10-29 12:47:00

+0

好點,固定 – Will 2009-10-29 12:50:00

+0

thx,現在我可以給你+1 – quinmars 2009-10-29 14:06:04

0

嘗試F(({1, 3, 2}), '-')

+0

這不會擴展到有效的C. – 2017-05-19 16:27:46

1

,而不是試圖使用宏來建立,使這些電話,我可能會考慮接口更改爲dash()使用可變參數:

#include <stdarg.h> 

void dash(char c, ...) 
{ 
    // ... 
} 


int main() { 
    dash('+', 1, 3, 2, -1); // note: negative number indicates 
           // the end of the list of numbers 
    return 0; 
} 

使用可變參數並不是世界上最好的東西(它們很難使用,也不是類型安全),但是我認爲它會比您嘗試創建的宏觀混合更好。另外,請記住,即使你堅持使用當前的接口dash()並提出了一個你想要的宏,但你仍然需要有一種方法來指示要傳入的數字序列的末尾dash()。否則,破折號無法知道它何時到達數組的末尾。可以有幾種選擇:

  • 使用一個標記值,如0,-1或任何負數(如上面的示例可變參數)
  • 傳遞元件的數量在陣列中作爲另一參數
  • 將數組的大小設置爲dash()的接口的一部分。在你的例子中,dash()可能需要傳入一個3個整數的數組。沒有更多,也不會少(實際上更多就是好 - 它們不會被使用)。如果你這樣做,修復你的宏將會容易得多,但我懷疑這不是你希望破折號行爲的方式。
4

這裏是我的版本:

#include <stdio.h> 

void dash(int len, int *n, char c){ 
    int i; 
    printf("dash(%i, {", len); 
    for(i=0; i<len-1; i++) 
    printf(" %i,", n[i]); 
    printf(" %i }, '%c')\n", n[i], c); 
} 

#define NOPAREN(...) __VA_ARGS__ 
#define F1(arr,char) { int f[]={NOPAREN arr}; dash(sizeof(f)/sizeof(f[0]),f,char); } 

#define F2(char,...) { int f[]=__VA_ARGS__; dash(sizeof(f)/sizeof(f[0]),f,char); } 

int main(void){ 
    F1((1,3,2), '-'); 
    F2('-', {4,6,5}); 
} 

結果:

dash(3, { 1, 3, 2 }, '-') 
dash(3, { 4, 6, 5 }, '-') 
0

您可以通過{ 1, 3, 2 }作爲參數傳遞給宏,如果你定義{ 1, 3, 2 }作爲另一個宏

#define PARAMS { 1, 3, 2 } 
F(PARAMS, '-') 
#undef PARAMS 

不幸的是,似乎沒有迪直接的方式來從字面上完成你所要求的事情,即以特定的形式通過{ 1, 3, 2 }。切換到其他方法可能是值得的,包括其他答案中提出的C99特定方法。