C语言 使用复合文字初始化变量

jhiyze9q  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(155)

下面的代码当放在作用域/函数中时无法编译,编译器将产生一个错误,说明initializer element is not constant行沿着的某些内容。这种情况发生在GCC和MSVC上。

static const char * const * const list = (const char *const[]){ "abc", "def", "xyz" };

但是,当代码放在任何函数之外,并且list被初始化为具有静态存储期限的全局变量时,代码编译良好,不会产生任何警告或错误。只有当list是非静态的时,它才能在作用域/函数中初始化。
下面这段来自cppreference docs的话引起了我的注意:
如果复合文字出现在文件范围内,则复合文字计算的未命名对象具有静态存储持续时间,如果复合文字出现在块范围内,则具有自动存储持续时间(在这种情况下,对象的生存期在封闭块的末尾结束)。
这是否意味着可以安全地说,具有静态存储期限的局部变量不能用复合文字初始化?

csbfibhn

csbfibhn1#

具有静态存储期限的对象可以通过常量表达式初始化。复合字面值不是常量(实际上它们是左值)。你不能用复合文字初始化具有静态存储期限的对象(尽管GCC允许它作为扩展)。

8yoxcaq7

8yoxcaq72#

将代码更改为下面的工作

static const char *const list[] = (const char *const[]){"abc", "def", "xyz"};

或者删除static关键字也可以

const char *const *const list = (const char *const[]){"abc", "def", "xyz"};

相关问题