我必须编写一个接受可变数量参数的函数,类似于open()函数
int open (const char *filename, int flags[, mode_t mode])
我查看了va_list功能,但是如何找出用户提供的参数数量?我不想在函数中有一个参数来表明这一点。
作为一种新手,我在哪里可以看到open()函数是如何实现的? open()如何知道用户是否提供了模式参数?
提前致谢。
答案 0 :(得分:5)
你不能。调用者必须提供尾随的sentinel参数(例如0
),或者明确告诉函数预期有多少参数(例如printf
中的格式字段)。
open
知道期望第三个参数,因为您将在O_CREAT
参数中设置flags
标志。
答案 1 :(得分:2)
直接从GCC page复制。
这是一个完整的示例函数,它接受可变数量的参数。函数的第一个参数是剩余参数的计数,它们被加起来并返回结果。虽然微不足道,但这个函数足以说明如何使用变量参数工具。
#include <stdarg.h>
#include <stdio.h>
int
add_em_up (int count,...)
{
va_list ap;
int i, sum;
va_start (ap, count); /* Initialize the argument list. */
sum = 0;
for (i = 0; i < count; i++)
sum += va_arg (ap, int); /* Get the next argument value. */
va_end (ap); /* Clean up. */
return sum;
}
int
main (void)
{
/* This call prints 16. */
printf ("%d\n", add_em_up (3, 5, 5, 6));
/* This call prints 55. */
printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
return 0;
}
答案 2 :(得分:0)
您正在寻找的是可变功能实现。 Here is a doc将引导您完成整个链条。
答案 3 :(得分:-1)
对问题的简短回答,“open
如何知道它是否通过了两三个论点?”是:它的魔力。很长的答案是,允许执行某些你不是的东西(在标准C中,即)。
另一个例子是main
。它有两个有效的原型:
int main(void);
和
int main(int argc, char *argv[]); /* or equivalent */
实现必须允许您使用两者中的任何一个,并使用“演绎”,这是您使用的那个。
问题的答案“我怎么能在我的代码中做类似的事情?”,是:你不能,至少不在C标准规定的约束范围内。