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