Reputation: 2218
I'm attempting to globally initialise a union as in the following example:
#include <cstdio>
typedef union {
char t[4];
int i;
} a;
enum {
w = 5000,
x,
y,
z
};
a temp = {w};
int main() {
printf("%d %d %d %d %d\n", temp.t[0],temp.t[1],temp.t[2],temp.t[3],temp.i);
return 0;
}
However, if you run the code, you'll note that neither of temp.i or temp.t[...] actually give the correct item i initialised the union with. I'd imagine this would be avoided if I could manually initialise the integer member, but unfortunately I can't. I also can't change the ordering of elements within the struct (swapping the int and char order initialises everything properly) - they're actually provided by an external library. My question is this: how can I set the integer member of the structure globally, rather than the char[4] member (or, in this case, just the first element of the char[])?
EDIT: Also, is there a strictly-c++ solution to this problem? i.e. one where named struct initialisation doesn't work (because it doesn't exist in the language)?
Upvotes: 7
Views: 2719
Reputation: 208333
In C99 you can do use named initialization as in:
a x = { .i = 10 };
There are some suggestion for using the non-standard gcc extension, but I would avoid it if coding C :
a x = { i : 10 };
You can use a function to initialize:
inline a initialize( int value ) { // probably choose a better name
a tmp;
tmp.i = value;
return a;
}
and then use:
a x = initialize( 10 );
The compiler will optimize the copies away.
If you are doing C++, you can provide a constructor for your union type:
/*typedef*/ union u { // typedef is not required in general in C++
char bytes[sizeof(int)];
int i;
u( int i = 0 ) : i(i) {}
} /*u*/;
u x( 5 );
Upvotes: 7
Reputation: 2584
You would want to do this:
a temp = {i: w};
That should work for both gcc
and g++
.
Upvotes: 7
Reputation: 43508
You can initialise the integer member like this:
a temp = {
.i = w
};
Upvotes: 5