Действительно ли возможно использовать предыдущие аргументы в списке параметров функций как значение по умолчанию для более поздних аргументов в списке параметров? Например,
void f( int a, int b = a, int c = b );
Если это возможно, там какие-либо правила использования?
Ответ - нет, вы не можете. Вы можете добиться желаемого поведения, используя перегрузки:
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 вообще не допускает параметры по умолчанию.
В качестве потенциального обходного пути вы можете сделать:
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; }
//...
}
Нет, это недопустимый C ++. Это указано в разделе 8.3.6 / 9 стандарта C ++:
Аргументы по умолчанию оцениваются каждый время вызова функции. В порядок оценки аргументов функции не указано. Как следствие, параметры функции не должны быть используется в выражениях аргументов по умолчанию, даже если они не оцениваются.
и:
int f (int a, int b = a); // ошибка: параметр a используется в качестве аргумента по умолчанию
И C89 по крайней мере не поддерживает значения параметров по умолчанию.
Нет, вы не можете этого сделать.
Вы обязательно получите сообщение об ошибке «Локальная переменная может не отображаться в этом контексте».
Я не думаю, что вы можете это сделать, поскольку это недопустимый синтаксис. Однако обратитесь к стандарту C99 в формате pdf ( n1136.pdf ).
Однако вы можете обойти это, используя static
как при объявлении переменных 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; /* ..... */ }
Престижность Майклу Берру за указание на мою ошибку! :)
Похоже, вам нужно переосмыслить свой код и изменить его на что-то вроде этого.