【发布时间】:2015-02-12 05:47:12
【问题描述】:
我对阅读 int x[4] = {}; 之类用于将结构/数组初始化为默认值的代码有微弱的记忆,它依赖于首次出现在 gcc 中的非标准(但广泛)扩展,以及正确的版本(显然标准中规定)为int x[4] = { 0 };
这对吗?
【问题讨论】:
标签: arrays c struct initialization braced-init-list
我对阅读 int x[4] = {}; 之类用于将结构/数组初始化为默认值的代码有微弱的记忆,它依赖于首次出现在 gcc 中的非标准(但广泛)扩展,以及正确的版本(显然标准中规定)为int x[4] = { 0 };
这对吗?
【问题讨论】:
标签: arrays c struct initialization braced-init-list
在 C 中,初始化列表定义如下
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
在 C++ 中,它是通过以下方式定义的
braced-init-list:
{ initializer-list ,opt }
{ }
如你所见,C++ 允许空的大括号初始化列表,而在 C 初始化列表中不能省略。
所以你可以用 C++ 编写
int x[4] = {};
但是,在 C 中,此定义不满足标准(尽管它可以是实现定义的语言扩展)。所以你必须写
int x[4] = { 0 };
在这两种情况下,数组的元素都将被初始化为零。
【讨论】:
static T foo = {0}; 会将foo 初始化为与static T foo 相同的值,并且在函数内T bar = {0}; 会将bar 初始化为与foo 已初始化的相同值。