使用复合字面量初始化变量

3
下面的代码无法在作用域/函数内编译,编译器会产生一个错误,指出类似于“初始化元素不是常量”。这在GCC和MSVC上都会发生。
static const char * const * const list = (const char *const[]){ "abc", "def", "xyz" }; 

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

以下引用来自cppreference docs

如果复合字面值在文件作用域出现,则复合字面值评估为无名对象,具有静态存储期;如果复合字面值在块作用域中出现,则复合字面值评估为无名对象,具有自动存储期(在这种情况下,对象的生命周期在封闭块的末尾结束)。

这是否意味着可以安全地说,具有静态存储期的局部变量不能使用复合字面值进行初始化?

2个回答

2
具有静态存储期的对象可以由常量表达式初始化。复合字面量不是常量(实际上它们是左值)。您不能使用复合字面量初始化具有静态存储期的对象(尽管GCC允许作为扩展)。

0
将代码改为以下内容即可运行。
static const char *const list[] = (const char *const[]){"abc", "def", "xyz"}; 

或者移除 static 关键字也可以工作

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

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接