C / C ++默认参数设置为前一个参数

我无法find明确的答案,虽然这可能是因为我没有使用正确的search条件,所以请redirect我,如果是这样的话。 是否有可能在函数参数列表中使用先前的参数作为参数列表中以后参数的默认值? 例如,

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

如果这是可能的,是否有任何使用规则? C和C ++有什么不同?

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

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

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

每次调用函数时都会评估默认参数。 函数参数的评估顺序是未指定的。 因此,函数的参数不应该用在默认参数expression式中,即使它们没有被评估。

和:

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

而C89至less不支持默认的参数值。

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

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

这不可能

不,你不能这样做。
你肯定会得到一个错误“本地variables可能不会出现在这个上下文中”。

我不认为你可以这样做,因为这是一个非法的语法。 但是,请参阅pdf格式的C99标准( n1136.pdf )。

但是,你可以通过使用static来解决这个问题,就像在声明variablesstatic并在函数f使用它们一样

 static int global_a;

 / *在你正在调用f()的其他地方,事先做这个* /
 / * global_a = 4;  F();  * /

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

荣誉迈克尔伯尔指出我的错误! 🙂

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

希望这有助于,最好的问候,汤姆。

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

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

我使用了-1,因为这个函数只能使用正值。 但是如果有人使用我的class级并且犯了一个错误,那么最终会给方法发送-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); } 

编码并不需要太长的时间,如果有人在具有自动完成function的编程界面中使用它,它将显示3个可能的原型。