复合文字是变量const
的有效初始化程序吗?static
#define COMPOUND ((const int [2]){1, 2})
static const int x = COMPOUND[0];
/* static const int x = 1; should be equivalent */
编辑:
第一条评论中可能的重复是没有意义的,因为我明确地询问const
文字,而不是变量。
复合文字是变量const
的有效初始化程序吗?static
#define COMPOUND ((const int [2]){1, 2})
static const int x = COMPOUND[0];
/* static const int x = 1; should be equivalent */
编辑:
第一条评论中可能的重复是没有意义的,因为我明确地询问const
文字,而不是变量。
是的,复合文字的元素可以用作初始值设定项。
C 2018 6.7.9 4 告诉我们初始化程序必须是什么:
具有静态或线程存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串文字。
6.6 告诉我们常量表达式可能是什么。第 3 段说:
常量表达式不应包含赋值、递增、递减、函数调用或逗号运算符,除非它们包含在未计算的子表达式中。
第 4 段说:
每个常量表达式都应计算为一个常量,该常量在其类型的可表示值范围内。
第 7 段将其扩展为:
初始化器中的常量表达式允许更大的自由度。这样的常量表达式应为或评估为以下之一:
- 算术常数表达式,
- 一个空指针常量,
- 地址常量,或
- 完整对象类型的地址常量加上或减去整数常量表达式。
其他段落都没有禁止使用复合文字,因此它们是允许的。