基于常量表达式的结果在指示符中 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
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