下面的代码当放在作用域/函数中时无法编译,编译器将产生一个错误,说明initializer element is not constant
行沿着的某些内容。这种情况发生在GCC和MSVC上。
static const char * const * const list = (const char *const[]){ "abc", "def", "xyz" };
但是,当代码放在任何函数之外,并且list
被初始化为具有静态存储期限的全局变量时,代码编译良好,不会产生任何警告或错误。只有当list
是非静态的时,它才能在作用域/函数中初始化。
下面这段来自cppreference docs的话引起了我的注意:
如果复合文字出现在文件范围内,则复合文字计算的未命名对象具有静态存储持续时间,如果复合文字出现在块范围内,则具有自动存储持续时间(在这种情况下,对象的生存期在封闭块的末尾结束)。
这是否意味着可以安全地说,具有静态存储期限的局部变量不能用复合文字初始化?
2条答案
按热度按时间csbfibhn1#
具有静态存储期限的对象可以通过常量表达式初始化。复合字面值不是常量(实际上它们是左值)。你不能用复合文字初始化具有静态存储期限的对象(尽管GCC允许它作为扩展)。
8yoxcaq72#
将代码更改为下面的工作
或者删除static关键字也可以