繁体   English   中英

如何允许将可变参数传递给函数

[英]How to allow variable parameters passed to function

我有一个接受3个参数的函数,但是我也希望它只接受前两个参数,而不关心第三个参数。 我如何在C中做到这一点。我尝试只是在头文件中将函数声明为void list()以为这可能意味着我们不在乎有多少参数,但这是行不通的。

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

您想要的就是可变函数 它可以接受可变数量的参数。

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

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

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

ISO C的语法在之前至少需要一个固定参数。 因此,我们照常编写固定的参数,然后在参数列表的末尾添加变量以指示可能添加其他参数。 例如,

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

定义一个函数func() ,该函数返回一个int并接受两个必需的参数,一个const char *和一个int 这些后面跟着任意数量的匿名参数。

您可以查看在线GNU手册以获取更多详细信息。

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

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);

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

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

总是有两个参数,但是argv的内容和其中的内容计数是变化的。 您可能已经在其他C程序的入口点(主要功能)中看到了这一点。 参数argc(参数计数)和argv(参数向量)给出所需数量和值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM