问题的背景:
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