Инициализация статической структуры в C - PullRequest
21 голосов
/ 07 октября 2011

У меня есть тип 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;

Я пытаюсь статически инициализировать его, но я не нашел способа сделать это. Это возможно?

Ответы [ 3 ]

31 голосов
/ 07 октября 2011

Должно работать так:

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

Инициализаторы фигурных скобок для структур и массивов могут быть вложенными.

17 голосов
/ 07 октября 2011

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

Конечно, инициализация анонимной структуры, подобной этой, не позволит вам создать более одной версии типа структуры без специальногонабрав другую версию, но если это все, что вы хотели, то она должна выполнить эту работу.

8 голосов
/ 07 октября 2011
#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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...