Union initialization in C++ and C

后端 未结 3 1734
太阳男子
太阳男子 2021-02-12 01:17

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];
  }         


        
相关标签:
3条回答
  • 2021-02-12 01:52

    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

    0 讨论(0)
  • 2021-02-12 02:14

    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.

    0 讨论(0)
  • 2021-02-12 02:15

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

    0 讨论(0)
提交回复
热议问题