私は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;
静的に初期化しようとしていますが、それを行う方法が見つかりません。これは可能ですか?
次のように動作するはずです。
move x = { { 1, 2, 3, 4}, 5.8, 1000, 21 };
構造体と配列のブレース初期化子はネストできます。
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};
もちろん、このような匿名構造を初期化すると、別のバージョンを特に入力せずに、構造タイプの複数のバージョンを作成することはできませんが、それが目的であれば、それで十分です。
#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