如何允许传递给函数的变量参数

时间:2015-06-19 11:30:35

标签: c function parameter-passing

我有一个接受3个参数的函数,但我也希望它只接受前两个而不关心第三个参数。我怎样才能在C中执行此操作。我尝试将头文件中的函数声明为void list() 认为这可能意味着我们不关心有多少参数,但这不起作用。

void list(uint8_t _pin, unsigned int time, unsigned long tasks)

3 个答案:

答案 0 :(得分:3)

您想要的是Variadic function。它可以接受可变数量的参数。

**着名的例子:printf() / scanf()

这些函数在参数列表中包含省略号()表示法,并使用特殊宏来访问变量参数。

最基本的想法是编写一个接受可变数量参数的函数。因此,必须使用原型声明它。

ISO C的语法要求之前至少有一个固定参数。因此,我们像往常一样编写固定参数,然后在参数列表的末尾添加 notain以指示其他参数的可能性。例如,

int func (const char *a, int b, …)
{
  …
}

定义一个函数func(),它返回int并获取两个必需参数,const char *int。其后是任意数量的匿名参数。

您可以查看On-line GNU manual了解详情。

答案 1 :(得分:0)

以下是SO中解释的技巧:C default arguments。 您可以在函数声明中将第三个参数设置为默认值,如下所示:

typedef struct {
    uint8_t _pin;
    unsigned int time;
    unsigned long tasks;

} f_args;

double var_f(f_args in){
    uint8_t  _pin = in._pin? in._pin : 8;
    unsigned int time = in.time ? in.time : 3;
    unsigned long tasks =in.tasks? in.taska : 0;
    return f_base(i_out, x_out);

    return list(_pin, time, tasks);
}

 #define list(...) var_f((f_args){__VA_ARGS__});

所以你可以按如下方式调用你的函数:

 list(2,5);

答案 2 :(得分:0)

没有可变参数的问题的另一种解决方案是执行以下操作:

void list(int argc, char **argv);

你总是有两个参数,但是argv的内容和内部的数量有什么变化。您可能已在其他C程序的入口点(主函数)中看到过这一点。参数argc,参数count和argv,参数vector,给出了你需要的数字和值。

然后在内部列表中,您可以执行以下操作:

if (argc == 2)
    do_something;
else if(argc == 3)
    do_something_else;
else
    whatever;