用const复合文字的元素初始化静态变量

时间:2019-02-08 15:16:30

标签: c static compound-literals

const复合文字是static变量的有效初始化器吗?

#define COMPOUND    ((const int [2]){1, 2})

static const int    x   = COMPOUND[0];
/* static const int x   = 1; should be equivalent */

编辑:

第一个注释中可能的重复项没有任何意义,因为我明确询问的是const文字,而不是变量。

1 个答案:

答案 0 :(得分:2)

是的,复合文字的元素可以用作初始化程序。

C 2018 6.7.9 4告诉我们什么是初始化器:

  

对于具有静态或线程存储持续时间的对象,初始化器中的所有表达式均应为常量表达式或字符串文字。

6.6告诉我们什么是常量表达式。第3段说:

  

常量表达式不得包含赋值,递增,递减,函数调用或逗号运算符,除非它们包含在未求值的子表达式中。

第4段说:

  

每个常量表达式的求值均应在其类型的可表示值范围内。

第7段将其扩展为:

  

在初始值设定项中,常量表达式可以更大的自由度。这样的常数表达式应为以下值之一或评估为以下值之一:

     
      
  • 算术常数表达式,
  •   
  • 空指针常量,
  •   
  • 地址常量,或
  •   
  • 用于完整对象类型的地址常量,加上或减去整数常量表达式。
  •   

其他段落均禁止使用复合文字,因此允许使用它们。