c宏,数组定义作为参数

时间:2014-09-14 20:28:29

标签: c arrays macros

我有这个方法

foo_l(int *array, size_t l)
{
    /*
    code
    */
}

我写了这个宏

#define foo(X) foo_l(X,sizeof(X)/sizeof(int))

所以我可以按如下方式使用它们

int main()
{
    int a[]={1,2,3};
    foo(a);
    return 0;
}

并且每次都避免写入数组的长度。


我的问题是,我可以扩展我的宏,以便它可以处理类似

的内容
foo_l((int[]){1,2,3}, 3);

在函数参数字段中声明了一个数组?

因为foo((int[]){1,2,3})不起作用!我认为问题是宏看到(int[]){1,2,3}作为参数列表而不是唯一参数。有什么想法吗?

P.S。我对宏观世界很陌生,我通常使用c99。

2 个答案:

答案 0 :(得分:3)

当传递给预处理器时,宏foo((int[]){1,2,3})失败,因为预处理器认为它提供了3个参数而不是1:

foo((int[]){1,2,3});
// is believed to be:
// Start of macro: foo(
// Parameter 1:    (int[]){1, 
// Parameter 2:    2, 
// Parameter 3:    3}
// End of macro:   );

所以它没有编译并给出类似的东西:

a.c: In function ‘main’:
a.c:15:23: error: macro "foo" passed 3 arguments, but takes just 1
     foo((int[]){1,2,3});

添加另一对括号可以解决问题:

// This shall work
foo(((int[]){1,2,3}));

EDITED:

是的,我想这可能不是一个好的设计,因为像平均程序员一样的人可能很可能将指针而不是数组类型传递给宏foo,并且它会失败,因为@DwayneTowell指出。
请注意这一点。 :)

答案 1 :(得分:0)

你所建议的并不是一个好主意,因为它会在以下情况下失败:

int a[] = {1,2,3,4};
int *b = a;
foo(b);        // becomes foo_l(b,sizeof(b)/(sizeof(int));
               // probably becomes foo_l(b,1)

通常,如果第一个参数是指向数组的指针而不是数组本身,则size参数将是错误的。通常,当sizeof(int *)== sizeof(int)时,表达式将计算为1,这是标准所要求的非常常见的。