我可以从上一个参数设置默认参数吗?

时间:2009-12-10 13:05:41

标签: c++ function arguments

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

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

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

7 个答案:

答案 0 :(得分:58)

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

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根本不允许默认参数。

答案 1 :(得分:28)

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

  

每个都会评估默认参数   调用函数的时间。该   函数参数的评估顺序   没有具体说明。所以,   函数的参数不应该是   用于默认参数表达式,   即使他们没有被评估。

  

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

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

答案 2 :(得分:5)

作为潜在的解决方法,您可以这样做:

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; }

    //...
}

答案 3 :(得分:3)

这是不可能的

答案 4 :(得分:2)

不,你不能那样做。
你肯定会收到错误“局部变量可能不会出现在这种情况下”。

答案 5 :(得分:1)

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

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种可能的原型。

答案 6 :(得分:0)

我认为你不能这样做,因为那是非法语法。但是,请参阅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指出我的错误!:)

听起来你需要重新考虑你的代码并改变它类似的东西。