C中的静态结构初始化

Per*_*etz 21 c struct initialization

我有一个结构类型,如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

我试图静态初始化它,但我还没有找到办法.这可能吗?

Ker*_* SB 31

它应该像这样工作:

move x = { { 1, 2, 3, 4}, 5.8, 1000, 21 };
Run Code Online (Sandbox Code Playgroud)

结构和数组的大括号初始值设定项可以嵌套.

  • 使用没有指定初始值设定项的静态初始化应该被认为是不推荐使用的,因为如果更改成员的顺序等,它很容易出错. (9认同)
  • 同样,应该弃用未命名的函数参数,因为如果参数的顺序发生变化,它很容易出错. (8认同)

Jas*_*son 18

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};
Run Code Online (Sandbox Code Playgroud)

当然,初始化这样的匿名结构不会允许您创建多个版本的结构类型而无需专门键入其他版本,但如果这是您想要的全部,那么它应该完成这项工作.


aka*_*ppa 8

#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;
}
Run Code Online (Sandbox Code Playgroud)

结果:

$ ./test

Aa:5