Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C code involving {}

I saw this in some C code:

Wininfo W = { sizeof(Wininfo) };

What the heck does this mean?

like image 922
Paul Reiners Avatar asked Jan 11 '10 15:01

Paul Reiners


3 Answers

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 Struct initialization of the C/C++ programming language? for related examples

like image 112
Ruben Bartelink Avatar answered Sep 21 '22 15:09

Ruben Bartelink


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

like image 23
sth Avatar answered Sep 17 '22 15:09

sth


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 exactly 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).

like image 24
AnT Avatar answered Sep 18 '22 15:09

AnT