C 使用复合文本初始化变量

C 使用复合文本初始化变量,c,gcc,visual-c++,c99,C,Gcc,Visual C++,C99,如果将以下代码放入作用域/函数中,则无法编译,编译器将生成一个错误,说明如下内容:初始值设定项元素不是常量。这发生在GCC和MSVC上 static const char *const *const list = (const char *const[]){"abc", "def", "xyz"}; 但是,当代码被放在任何函数之外,并且list被初始化为具有静态存储持续时间的全局变量时,代码可以很好地编译,并且不会产生任何警告或错误。只有当列表是非静态的时,才可以在范围/函数内对其进行初始化

如果将以下代码放入作用域/函数中,则无法编译,编译器将生成一个错误,说明如下内容:
初始值设定项元素不是常量
。这发生在GCC和MSVC上

static const char *const *const list = (const char *const[]){"abc", "def", "xyz"}; 
但是,当代码被放在任何函数之外,并且
list
被初始化为具有静态存储持续时间的全局变量时,代码可以很好地编译,并且不会产生任何警告或错误。只有当
列表
是非静态的时,才可以在范围/函数内对其进行初始化

我注意到了下面的一段引语:

复合文字计算到的未命名对象具有静态属性 如果复合文字出现在文件范围和 如果复合文字出现在块中,则自动存储持续时间 范围(在这种情况下,对象的生存期在 封闭块)


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

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