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