2009-10-29 69 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特定方法。