如何在指定的初始化程序中引用参数?

问题描述

我想将一个参数的值添加到指定的初始化程序内的另一个参数,而不必定义一个单独的变量来保存该值。这可能吗?

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

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

解决方法

这是不可能的。初始化程序中表达式的求值顺序不按任何特定顺序求值,因此不能保证在将.x设置为.y之前将.x + 2设置为1。

这在C standard的6.7.9p23节中有详细说明:

对初始化列表表达式的求值为 彼此不确定地排序,
因此,发生任何副作用的顺序是 未指定。 152)

脚注152指出:

尤其是,评估顺序不必与顺序相同 子对象初始化。