通过宏C初始化数组
问题的背景: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初始化数组
尝试F(({1, 3, 2}), '-')
这不会扩展到有效的C. – 2017-05-19 16:27:46
,而不是试图使用宏来建立,使这些电话,我可能会考虑接口更改为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个整数的数组。没有更多,也不会少(实际上更多就是好 - 它们不会被使用)。如果你这样做,修复你的宏将会容易得多,但我怀疑这不是你希望破折号行为的方式。
这里是我的版本:
#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 }, '-')
您可以通过{ 1, 3, 2 }
作为参数传递给宏,如果你定义{ 1, 3, 2 }
作为另一个宏
#define PARAMS { 1, 3, 2 }
F(PARAMS, '-')
#undef PARAMS
不幸的是,似乎没有迪直接的方式来从字面上完成你所要求的事情,即以特定的形式通过{ 1, 3, 2 }
。切换到其他方法可能是值得的,包括其他答案中提出的C99特定方法。
目前还不清楚'破折号'如何确定阵列中有多少元素。总是有3个? – 2009-10-29 15:45:36
我已经实现了它在最后一个元素处停止,它必须是0.但是这对于问题本身并不重要,所以我把它留在这里。 – 2009-10-31 12:14:56