34

次のように定義されたヘッダーファイルで、定数を使用する作業用の C ライブラリを構築しました。

typedef struct Y {
  union {
    struct bit_field bits;
    uint8_t raw[4];
  } X;
} CardInfo;

static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } };

.raw初期化子が C のみの構文であることはわかっています。

C および C++ で使用できるように、共用体を含む定数を定義するにはどうすればよいですか。

4

3 に答える 3

22

私も同じ問題を抱えていました。C89 の場合、次のことが当てはまります。

C89 スタイルの初期化子では、宣言された順序で構造体メンバーを初期化する必要があり、共用体の最初のメンバーのみを初期化できます

この説明は 、構造体と共用体の初期化で見つけました。

于 2013-11-22T10:11:51.210 に答える
7

C++11 では、次のように独自のコンストラクターを記述できると思います。

union Foo
{
    X x;
    uint8_t raw[sizeof(X)];

    Foo() : raw{} { }
};

これは、すべての要素がゼロで初期化されているFooアクティブな memberを持つタイプの共用体をデフォルトで初期化します。raw(C++11 より前は、完全なオブジェクトではない配列を初期化する方法がありませんでした。)

于 2012-07-19T07:31:17.640 に答える
2

次の道を選ぶことにしました。

  • 初期化は使用しないでください.member
  • static const struct Foobarメンバーの初期化を使用しない

代わりに、グローバル変数を宣言します。

extern "C" {
  extern const struct Foobar foobar;
}

グローバルセクションで初期化します。

struct Foobar foobar = { 0, 0, 0, 0 };

そして、最新の ANSI C99 構文で C++ コンパイラをバグる代わりに、リンカに C シンボルをデマングリングする作業をさせました。

于 2012-07-27T01:48:17.147 に答える