C默认参数

有没有一种方法可以在C中为函数指定默认参数?


不是真的。 唯一的办法是编写一个可变参数函数并手动为调用者不传递的参数填充默认值。


哇,这里每个人都是这样的悲观主义者。 答案是肯定的。

它不是微不足道的:最终,我们将拥有核心函数,支持结构,包装函数和围绕包装函数的宏。 在我的工作中,我有一组宏来自动化所有这些; 一旦你了解了流程,你也很容易做到这一点。

我在其他地方写过这篇文章,所以这里有一个详细的外部链接来补充总结:http://modelingwithdata.org/arch/00000022.htm

我们想转过来

double f(int i, double x)

转换成一个采用默认值的函数(i = 8,x = 3.14)。 定义伴随结构:

typedef struct {
    int i;
    double x;
} f_args;

重命名函数f_base ,并定义一个包装函数来设置默认值并调用基类:

double var_f(f_args in){
    int i_out = in.i ? in.i : 8;
    double x_out = in.x ? in.x : 3.14;
    return f_base(i_out, x_out);
}

现在使用C的可变宏来添加一个宏。 这样用户不必知道他们实际上正在填充一个f_args结构,并认为他们正在进行:

#define f(...) var_f((f_args){__VA_ARGS__});

好的,现在所有以下都可以工作:

f(3, 8);      //i=3, x=8
f(.i=1, 2.3); //i=1, x=2.3
f(2);         //i=2, x=3.14
f(.x=9.2);    //i=8, x=9.2

检查复合初始值设定项如何为精确规则设置默认值的规则。

有一件事不起作用: f(0) ,因为我们无法区分缺失值和零。 根据我的经验,这是值得注意的事情,但可以根据需要进行处理 - 一半的时间默认为零。

我经历了写这个问题的麻烦,因为我认为命名参数和默认值确实使得C语言编码更容易,更有趣。 而C非常棒,因为它非常简单,而且还有足够的空间让所有这些成为可能。


是。 :-)但不会以你期望的方式。

int f1(int arg1, double arg2, char* name, char *opt);

int f2(int arg1, double arg2, char* name)
{
  return f1(arg1, arg2, name, "Some option");
}

不幸的是,C不允许你重载方法,所以你最终会得到两个不同的函数。 尽管如此,通过调用f2,你实际上会用默认值调用f1。 这是一个“不要重复自己”的解决方案,它可以帮助您避免复制/粘贴现有​​代码。

链接地址: http://www.djcxy.com/p/28513.html

上一篇: C default arguments

下一篇: Python class instance variable isolation