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