web-dev-qa-db-ja.com

Cでの静的構造体の初期化

私はstructタイプを以下に示すように持っています:

typedef struct position{
    float X;
    float Y;
    float Z;
    float A;
} position;

typedef struct move{
    position initial_position;
    double feedrate;
    long speed;
    int g_code;
} move;

静的に初期化しようとしていますが、それを行う方法が見つかりません。これは可能ですか?

21
Peretz

次のように動作するはずです。

move x = { { 1, 2, 3, 4}, 5.8, 1000, 21 };

構造体と配列のブレース初期化子はネストできます。

31
Kerrek SB

Cには、CのC++ ...などの構造体/クラスの静的メンバーオブジェクトの概念がありません。構造体と関数の宣言のstaticキーワードは、そのオブジェクトをコンパイル中に現在のコードモジュールに表示されます。したがって、現在のコードでstaticキーワードを使用しようとしても機能しません。さらに、あなたがしたように、宣言の時点で構造データ要素を初期化することはできません。代わりに、 指定された初期化子 を使用して以下を実行できます。

static struct {
    position initial_position;
    double feedrate;
    long speed;
    int g_code;
} move = { .initial_position.X = 1.2,
           .initial_position.Y = 1.3,
           .initial_position.Z = 2.4,
           .initial_position.A = 5.6,
           .feedrate = 3.4, 
           .speed = 12, 
           .g_code = 100};

もちろん、このような匿名構造を初期化すると、別のバージョンを特に入力せずに、構造タイプの複数のバージョンを作成することはできませんが、それが目的であれば、それで十分です。

18
Jason
#include <stdio.h>

struct A {
    int a;
    int b;
};

struct B {
    struct A a;
    int b;
};

static struct B a = {{5,3}, 2};

int main(int argc, char **argv) {
    printf("A.a: %d\n", a.a.a);
    return 0;
}

結果:

$ ./test

A.a:5

8
akappa