2015-06-19 45 views
0

我有一个函数接受3个参数,但是我也希望它只接受前两个而不关心第三个参数。我怎样才能做到这一点我试着只是在头文件中声明函数为void list() 认为这可能意味着我们不关心有多少参数,但这不起作用。如何允许传递给函数的可变参数

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

看一看了'stdarg.h'头。 – fuz

+1

函数如何知道是否查看第三个参数? – immibis

+0

你可以修改函数,它是如何调用的,或者两者兼而有之? – StephenTG

回答

3

你想要什么叫做Variadic function。它可以接受可变数量的参数。

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

这些功能包含省略号()在参数列表中的符号,并使用特定的宏访问可变参数。

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

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

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

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

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

+0

你应该从这些链接中提取一些信息到你的答案中。维基百科可能不是最有可能变成死链接,但仍然... – StephenTG

+0

这看起来更好。 – StephenTG

+0

@StephenTG谢谢。 :-) –

0

这里是在这里解释的一个把戏: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); 
0

不同的解决问题的方法没有可变参数是做什么像这样:

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

你有两个参数总是,但是什么样的变化是的argv内容,什么是它里面的数。您可能在其他C程序的入口点(main函数)中看到了这一点。参数argc,参数count和argv参数向量给出了你所需要的数量和值。

内。然后列表,你可以这样做:

if (argc == 2) 
    do_something; 
else if(argc == 3) 
    do_something_else; 
else 
    whatever; 
相关问题