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允许将其作为扩展)