Я могу установить параметр по умолчанию от предыдущего аргумента?

Действительно ли возможно использовать предыдущие аргументы в списке параметров функций как значение по умолчанию для более поздних аргументов в списке параметров? Например,

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

Если это возможно, там какие-либо правила использования?

42
задан Baum mit Augen 29 April 2018 в 18:04
поделиться

6 ответов

Ответ - нет, вы не можете. Вы можете добиться желаемого поведения, используя перегрузки:

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 вообще не допускает параметры по умолчанию.

63
ответ дан 26 November 2019 в 23:29
поделиться

В качестве потенциального обходного пути вы можете сделать:

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

    //...
}
5
ответ дан 26 November 2019 в 23:29
поделиться

Это невозможно

3
ответ дан 26 November 2019 в 23:29
поделиться

Нет, это недопустимый C ++. Это указано в разделе 8.3.6 / 9 стандарта C ++:

Аргументы по умолчанию оцениваются каждый время вызова функции. В порядок оценки аргументов функции не указано. Как следствие, параметры функции не должны быть используется в выражениях аргументов по умолчанию, даже если они не оцениваются.

и:

int f (int a, int b = a); // ошибка: параметр a используется в качестве аргумента по умолчанию

И C89 по крайней мере не поддерживает значения параметров по умолчанию.

30
ответ дан 26 November 2019 в 23:29
поделиться

Нет, вы не можете этого сделать.
Вы обязательно получите сообщение об ошибке «Локальная переменная может не отображаться в этом контексте».

2
ответ дан 26 November 2019 в 23:29
поделиться

Я не думаю, что вы можете это сделать, поскольку это недопустимый синтаксис. Однако обратитесь к стандарту 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;
   /* ..... */
}

Престижность Майклу Берру за указание на мою ошибку! :)

Похоже, вам нужно переосмыслить свой код и изменить его на что-то вроде этого.

0
ответ дан 26 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: