views:

298

answers:

3

I saw this in some C code:

Wininfo W = { sizeof(Wininfo) };

What the heck does this mean?

+15  A: 

This code is initializing a struct using funky C initializer syntax to initialize each field in order of declaration, see http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=421. An important side-effect in the case of this example is that remaining fields one doesnt specify values for get initialized to zeros.

This trick is a relatively common one in Win32 APIs - the API requires the size to be pre-set as a way of indicating the version the client code is compiled against - in many of these cases, one is also expected to clear the buffer, which would ordinarily involve a separate call to e.g. memset prior to initializing the size field with the sizeof.

See also http://stackoverflow.com/questions/1705147/struct-initialization-of-the-c-c-programming-language for related examples

Ruben Bartelink
+9  A: 

It's an initializer expression that sets the first field of W to sizeof(Wininfo) and the other fields to zero.

sth
+1 (and stole most of the answer to make mine a lot less incomplete :P)
Ruben Bartelink
+4  A: 

Firstly, it is not a statement, it is a declaration. Declarations are not statements in C.

Secondly, the = { /* whatever */ } part is an initializer - it specifies the initial value of an object. Normally you use initializers enclosed in {} to initialize aggregate objects: arrays or structs. However, a little known-feature of C language is that initializers of scalar objects can also be optionally enclosed in {}, as in

int i = { 5 };

What your specific declaration means depends on what Wininfo type is. If W is an aggregate, then its first member is initialized with sizeof(Wininfo) value and the rest is initialized with zeroes. If W is a scalar, then it just gets the initial value of sizeof(Wininfo).

AndreyT
Since it includes an initializer, it's not just a declaration, but a definition.
Jerry Coffin
Definition is always a declaration. So, it contexts when the distinction is of no importance, the term *declaration* is normally used. The syntactic element is always called *declaration*. Definitions only exist at the level of semantics.
AndreyT
+1: Nice and complete (@nos: this is what I was angling at when mentioning redundant)
Ruben Bartelink