我可以设置以前的参数的默认参数吗?

是否可以将函数参数列表中的先前参数用作参数列表中后续参数的默认值? 例如,

void f( int a, int b = a, int c = b );

如果可能,是否有任何使用规则?

bpw1621 asked 2020-08-09T01:40:43Z
7个解决方案
63 votes

答案是否定的,你不能。 您可以使用重载获得所需的行为:

void f(int a, int b, int c);
inline void f(int a, int b) { f(a,b,b); }
inline void f(int a)        { f(a,a,a); }

至于最后一个问题,C根本不允许使用默认参数。

Mike Seymour answered 2020-08-09T01:40:54Z
30 votes

不,这不是合法的C ++。 这在C ++标准的第8.3.6 / 9节中指定:

默认参数分别计算 函数被调用的时间。 的 函数参数的求值顺序 未指定。 所以, 函数的参数不得为 用于默认参数表达式中 即使未对其进行评估。

和:

int f(int a,int b = a); //错误: 参数a用作默认参数

而且C89至少不支持默认参数值。

Daniel Wolf answered 2020-08-09T01:41:32Z
5 votes

作为一种可能的解决方法,您可以执行以下操作:

const int defaultValue = -999; // or something similar

void f( int a, int b = defaultValue, int c = defaultValue )
{
    if (b == defaultValue) { b = a; }
    if (c == defaultValue) { c = b; }

    //...
}
e.James answered 2020-08-09T01:41:52Z
3 votes

这是不可能的

Andreas Brinck answered 2020-08-09T01:42:12Z
2 votes

不,你不能那样做。
您肯定会收到错误“本地变量可能不会在此上下文中出现”。

Prasoon Saurav answered 2020-08-09T01:42:36Z
1 votes

您的第一个想法可能是做这样的事情:

void something(int a, int b=-1, int c=-1){
    if(b == -1)
        b = a;
    if(c == -1)
        c = b;
}

我使用-1,因为此函数仅适用于正值。 但是,如果有人使用我的课程并犯了一个错误,最终向该方法发送-1怎么办? 它仍然可以编译和执行,但是结果对于用户来说是不可预测的。 因此,明智的做法是删除所有默认参数,而是制作一堆具有相同名称的方法,如下所示:

void something(int a, int b, int c){
    /* Do something with a, b and c */
}

void something(int a){
    something(a, a, a);
}

void something(int a, int b){
    something(a, b, b);
}

编写代码实际上并不需要花费更长的时间,如果有人在具有自动完成功能的编程界面中使用它,它将显示3种可能的原型。

Domino answered 2020-08-09T01:43:06Z
0 votes

我认为您不能这样做,因为那是非法语法。 但是,请查阅pdf格式的C99标准(n1136.pdf)。

但是,您可以使用static来解决此问题,就像声明变量静态并将其在函数f中使用一样

static int global_a;

/* In some other spot where you are calling f(), do this beforehand */
/* global_a = 4; f(); */

void f(void){
   int a = global_a;
   b = c = a;
   /* ..... */
}

感谢Michael Burr指出我的错误! :)

听起来您需要重新考虑代码,并进行类似的更改。

t0mm13b answered 2020-08-09T01:43:39Z
translate from https://stackoverflow.com:/questions/1880866/can-i-set-a-default-argument-from-a-previous-argument