涉及{}的C代码

时间:2010-01-11 15:00:36

标签: c curly-braces static-initializer

我在一些C代码中看到了这一点:

Wininfo W = { sizeof(Wininfo) };

这意味着什么?

3 个答案:

答案 0 :(得分:15)

此代码使用funky C初始化程序语法初始化struct,以按声明的顺序初始化每个字段,请参阅http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=421。在这个例子中,一个重要的副作用是剩下的字段没有指定get初始化为零的值。

这个技巧在Win32 API中是一个相对常见的技巧 - API需要预先设置大小,以指示客户端代码编译的版本 - 在许多情况下,还需要清除一个缓冲区,通常涉及单独调用例如在使用memset初始化大小字段之前sizeof

有关相关示例,请参阅Struct initialization of the C/C++ programming language?

答案 1 :(得分:9)

initializer expressionW的第一个字段设置为sizeof(Wininfo),将其他字段设置为零。

答案 2 :(得分:5)

首先,它不是声明,而是声明。声明不是C语句。

其次,= { /* whatever */ }部分是初始值设定项 - 它指定对象的初始值。通常,您使用{}中包含的初始化程序来初始化聚合对象:数组或结构。但是,C语言的一个鲜为人知的特性是标量对象的初始化器也可以选择性地包含在{}中,如

int i = { 5 };

具体声明的确切含义取决于Wininfo类型。如果W是聚合,则其第一个成员初始化为sizeof(Wininfo)值,其余成员用零初始化。如果W是标量,那么它只会获得sizeof(Wininfo)的初始值。