Union initialization in C++ and C
Solution 1
I had the same problem. For C89 the following is true:
With C89-style initializers, structure members must be initialized in the order declared, and only the first member of a union can be initialized
I found this explanation at: Initialization of structures and unions
Solution 2
I believe that C++11 allows you to write your own constructor like so:
union Foo
{
X x;
uint8_t raw[sizeof(X)];
Foo() : raw{} { }
};
This default-initializes a union of type Foo
with active member raw
, which has all elements zero-initialized. (Before C++11, there was no way to initialize arrays which are not complete objects.)
Solution 3
I decided to choose the following path.
- Do not use
.member
initialization. - do nost use
static const struct Foobar
initialization of members
Instead declare the global variable:
extern "C" {
extern const struct Foobar foobar;
}
and initialize it in a global section:
struct Foobar foobar = { 0, 0, 0, 0 };
and instead of bugging the C++ compiler with modern ANSI C99 syntax I let the linker do the work be demangling C symbols.
![Alexander Oh](https://i.stack.imgur.com/UmvnY.jpg?s=256&g=1)
Alexander Oh
Worked with C++, Java, C#, Go, Python. Built code for Embedded Systems, Network Switches, Windows, L4, FreeBSD, and Linux. Used to work just with embedded systems, but I have now pivoted towards cloud native services. Flexible around how to solve it, but focused on delivering working Software. Not very active anymore, mainly answering questions where current answers are incomplete and questionable.
Updated on August 12, 2020Comments
-
Alexander Oh almost 4 years
I have built a working C library, that uses constants, in header files defined as
typedef struct Y { union { struct bit_field bits; uint8_t raw[4]; } X; } CardInfo; static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } };
I know that the
.raw
initializer is C only syntax.How do I define constants with unions in them in a way such that I can use them in C and C++.