基于常量表达式的结果在指示符中 select 标识符的能力是否有用?

Will an ability to select identifier in designator based on the result of constant expression be useful?

C11, 6.7.9 初始化:

designator:
    [ constant-expression ]
    . identifier

根据常量表达式的结果在指示符中 select 标识符的能力是否有用?

基本原理:如果“可以在翻译期间而不是运行时评估常量表达式”(6.6 常量表达式),则其结果可用于提供 select 标识符中的标识符的能力。

示例:

union
{
    float f;
    int   i;
} x = { <constant-expression> ? .f = 1.0f : .i = 0 };

可以理解为:根据常量表达式的结果来控制目的类型。否则(现在)需要提前知道目标类型(即标识符中的标识符)。

我认为 OP 对标准所说的感到困惑。

designator:
    [ constant-expression ]
    . identifier

只是 6.7.9p35 中示例的定义:

35   EXAMPLE 11 Designators can be used to provide explicit initialization when unadorned initializer lists
     might be misunderstood:
              struct { int a[3], b; } w[] =
                    { [0].a = {1}, [1].a[0] = 2 };

所以这里有一个变量w,它是一个struct数组,[0].a = {1}初始化数组w的第一个元素的字段a

所以

union
{
    float f;
    int   i;
} x = { <constant-expression> ? .f = 1.0f : .i = 0 };

当前无效C

Will an ability to select identifier in designator based on the result of constant expression be useful?

由于代码已经可以有选择地初始化一个对象,我认为 OP 的新想法有选择地初始化一个成员的应用很少。

typedef union {
  float f;
  int i;
} fi;

int main() {
  fi x = 0 ? (fi) {.f = 1.0f} : (fi) {.i = 0};
  printf("%f %d\n", x.f, x.i);
  fi y = 1 ? (fi) {.f = 1.0f} : (fi) {.i = 0};
  printf("%f %d\n", y.f, y.i);
  return 0;
}

输出

0.000000 0
1.000000 1065353216