Как я могу сослаться на параметр в назначенном инициализаторе?

Я хочу добавить значение параметра к другому параметру в назначенном инициализаторе без необходимости определять отдельную переменную для хранения этого значения. Это возможно?

typedef struct {
  int x;
  int y;
} point;

int main() {
  point p = {
    .x = 1,
    .y = x + 2 // I want to reference .x
  };
}

person Dio    schedule 25.10.2020    source источник


Ответы (1)


Это невозможно. Порядок оценки выражений в инициализаторе не оценивается в каком-либо конкретном порядке, поэтому нет гарантии, что .x будет установлено в 1 до того, как .y будет установлено в .x + 2.

Это указано в разделе 6.7.9p23 C стандарт:

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

Где сноска 152 гласит:

В частности, порядок оценки не обязательно должен совпадать с порядком инициализации подобъекта.

person dbush    schedule 25.10.2020