具有可变参数的函数。 open()如何工作?

时间:2011-06-27 20:33:23

标签: c linux

我必须编写一个接受可变数量参数的函数,类似于open()函数

int open (const char *filename, int flags[, mode_t mode])
  1. 我查看了va_list功能,但是如何找出用户提供的参数数量?我不想在函数中有一个参数来表明这一点。

  2. 作为一种新手,我在哪里可以看到open()函数是如何实现的? open()如何知道用户是否提供了模式参数?

  3. 提前致谢。

4 个答案:

答案 0 :(得分:5)

  1. 你不能。调用者必须提供尾随的sentinel参数(例如0),或者明确告诉函数预期有多少参数(例如printf中的格式字段)。

  2. 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标准规定的约束范围内。