【问题标题】:Initializing variables with a compound literal使用复合文字初始化变量
【发布时间】:2018-04-26 02:23:25
【问题描述】:

以下代码在放入作用域/函数时无法编译,编译器将产生错误,说明类似于:initializer element is not constant。这发生在 GCC 和 MSVC 上。

static const char *const *const list = (const char *const[]){"abc", "def", "xyz"}; 

但是当代码放在任何函数之外并且list 被初始化为具有静态存储持续时间的全局变量时,代码编译良好并且不会产生任何警告或错误。只有当list 是非静态时,它也可以在作用域/函数内进行初始化。

cppreference docs 的以下引用引起了我的注意:

复合字面量求值的未命名对象具有静态 如果复合文字出现在文件范围内,则存储持续时间,并且 如果复合文字出现在块中,则自动存储持续时间 范围(在这种情况下,对象的生命周期在 封闭块)。

这是否意味着可以肯定地说具有静态存储持续时间的局部变量不能用复合文字初始化?

【问题讨论】:

    标签: c gcc visual-c++ c99


    【解决方案1】:

    具有静态存储持续时间的对象可以通过常量表达式进行初始化。复合文字不是常量(实际上它们是左值)。您不能使用复合文字初始化具有静态存储持续时间的对象(尽管 GCC 允许它作为扩展名)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多