Union initialization in C++ and C

42,598

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.

Share:
42,598
Alexander Oh
Author by

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, 2020

Comments

  • Alexander Oh
    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++.