問題的背景:
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初始化數組
2
A
回答
4
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特定方法。
相關問題
- 1. 初始化數組通過引用C++
- 2. 通過數組初始化對象
- 3. 初始化C結構通過函數
- 4. C#初始化數組
- 5. C數組初始化
- 6. C++數組初始化
- 7. C++數組初始化
- 8. C++數組初始化
- 9. 數組c初始化
- 10. 初始化數組C++
- 11. C++數組初始化
- 12. c#通過使用方法初始化某些特定數組
- 13. 初始化數組時初始化System.AccessViolationException
- 14. 通過宏過度使用結構初始化
- 15. C/C++私有數組初始化
- 16. C/C++中的數組初始化
- 17. 初始化字符數組 - C和C++
- 18. C結構自動初始化值,數組初始化
- 19. 用數組或初始化初始化一個NSMutableArray初始化
- 20. 無法用ifdef'd宏初始化數組結構中的數組
- 21. 數組初始化
- 22. 數組初始化
- 23. 初始化數組
- 24. 數組初始化
- 25. 如何初始化整數數組C#
- 26. SELECT2初始化通過javascript
- 27. C - 如何初始化一個預初始化的二維數組數組?
- 28. 陣列初始化宏
- 29. 初始化指令數據通過$ HTTP
- 30. 你如何初始化(通過初始化列表)在C + + 11中的多維std ::數組?
目前還不清楚'破折號'如何確定陣列中有多少元素。總是有3個? – 2009-10-29 15:45:36
我已經實現了它在最後一個元素處停止,它必須是0.但是這對於問題本身並不重要,所以我把它留在這裏。 – 2009-10-31 12:14:56