如何允许可变参数传递给函数
How to allow variable parameters passed to function
我有一个接受 3 个参数的函数,但是我也希望它只接受前两个而不关心第三个。我怎样才能在 C 中执行此操作。我尝试将头文件中的函数声明为 void list()
认为这可能意味着我们不关心有多少参数,但这是行不通的。
void list(uint8_t _pin, unsigned int time, unsigned long tasks)
你要的叫Variadic function。它可以接受可变数量的参数。
**著名例子:printf()
/scanf()
这些函数在参数列表中包含省略号 (…
) 符号,并使用特殊宏来访问变量参数。
最基本的想法是编写一个接受可变数量参数的函数。所以,它必须用这样声明的原型来声明。
ISO C 语法要求 …
前至少有一个固定参数。因此,我们像往常一样编写固定参数,然后在参数列表的末尾添加 …
notain 以指示附加参数的可能性。例如,
int func (const char *a, int b, …)
{
…
}
定义了一个函数 func()
,它 returns 一个 int
并接受两个必需的参数,一个 const char *
和一个 int
。这些后面跟着任意数量的匿名参数。
您可以查看On-line GNU manual了解更多详情。
这是 SO here 中解释的一个技巧: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);
没有可变参数的问题的另一种解决方案是做这样的事情:
void list(int argc, char **argv);
你总是有两个参数,但是改变的是 argv 的内容和里面的计数。您可能已经在其他 C 程序的入口点(主函数)中看到了这一点。参数argc,argument count,和argv,argument vector,给出你需要的数量和值。
然后在列表中你可以做类似的事情:
if (argc == 2)
do_something;
else if(argc == 3)
do_something_else;
else
whatever;
我有一个接受 3 个参数的函数,但是我也希望它只接受前两个而不关心第三个。我怎样才能在 C 中执行此操作。我尝试将头文件中的函数声明为 void list()
认为这可能意味着我们不关心有多少参数,但这是行不通的。
void list(uint8_t _pin, unsigned int time, unsigned long tasks)
你要的叫Variadic function。它可以接受可变数量的参数。
**著名例子:printf()
/scanf()
这些函数在参数列表中包含省略号 (…
) 符号,并使用特殊宏来访问变量参数。
最基本的想法是编写一个接受可变数量参数的函数。所以,它必须用这样声明的原型来声明。
ISO C 语法要求 …
前至少有一个固定参数。因此,我们像往常一样编写固定参数,然后在参数列表的末尾添加 …
notain 以指示附加参数的可能性。例如,
int func (const char *a, int b, …)
{
…
}
定义了一个函数 func()
,它 returns 一个 int
并接受两个必需的参数,一个 const char *
和一个 int
。这些后面跟着任意数量的匿名参数。
您可以查看On-line GNU manual了解更多详情。
这是 SO here 中解释的一个技巧: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);
没有可变参数的问题的另一种解决方案是做这样的事情:
void list(int argc, char **argv);
你总是有两个参数,但是改变的是 argv 的内容和里面的计数。您可能已经在其他 C 程序的入口点(主函数)中看到了这一点。参数argc,argument count,和argv,argument vector,给出你需要的数量和值。
然后在列表中你可以做类似的事情:
if (argc == 2)
do_something;
else if(argc == 3)
do_something_else;
else
whatever;