{}和{0}作为结构体初始化器有什么区别?

4
这个与这个有什么不同吗:
struct something s = {};

还有这个呢?

struct something s = {0};

据我所知,两者都会将每个成员初始化为零。

1个回答

8
在C语言中,struct something s = {};不是有效的写法 (除非在C11中添加了该功能),但在C++中则是有效的。GCC允许在C程序中使用它,作为一种扩展方式。(尽管我没有在http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html文档中找到相关说明,可能只是我漏看了)。
在C++中,这会导致进行“值初始化”,也就是说会调用每个成员的默认构造函数(对于非类成员进行零初始化)。

1
FYI,这个还没有被添加到C11中,{0}仍然是C的万能初始化器,而{}则是语法错误。 - Jens Gustedt
1
@JensGustedt 很不幸,近年来GCC开始出现分歧,并对{0}发出令人讨厌的诊断,当0匹配某些内部聚合时,您必须使用{{0}}或类似方法来消除这种情况。 - Kaz
1
@Kaz,是的,这真的很烦人。对于gcc,“缺少大括号”是我系统地关闭的警告之一,就是为了这个原因。 - Jens Gustedt
1
“-Wno-missing-braces -Wno-missing-field-initializers” 是我 GCC 构建脚本中的标准选项。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接