【问题标题】:How to allow variable parameters passed to function如何允许将可变参数传递给函数
【发布时间】:2015-09-05 08:57:24
【问题描述】:

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

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

【问题讨论】:

  • 看看stdarg.h 标头。
  • 函数如何知道是否要看第三个参数?
  • 你能修改函数,它是如何调用的,还是两者都修改?
  • 如果只是忽略第三个参数,我会在使用可变参数函数之前三思而后行。而是传递一个虚拟值(0/NULL 通常是个好主意)。但是,您必须考虑 函数如何决定是否忽略第三个参数(注意:C 没有函数参数)。

标签: c function parameter-passing


【解决方案1】:

没有可变参数的问题的不同解决方案是执行以下操作:

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

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

然后在列表中你可以做类似的事情:

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

【讨论】:

    【解决方案2】:

    这里有一个在 SO 中解释的技巧: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);
    

    【讨论】:

      【解决方案3】:

      你想要的是Variadic function。它可以接受可变数量的参数。

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

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

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

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

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

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

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

      【讨论】:

      • 您可能应该将这些链接中的一些信息提取到您的答案中。维基百科可能不是最有可能变成死链接的,但仍然......
      • @StephenTG 谢谢。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2023-01-21
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多