我知道如何初始化结构(通常),但我遇到了麻烦 struct struct中的struct
typedef struct Location{
uint8_t x;
uint8_t y;
} loc;
typedef struct Person{
loc location;
} person;
全局变量:
static person hero;
初始化函数:
void InitializeHero() {
person hero = {0,0, {0,0}}; // this compiles
hero.location = {0,0}; // but this does not compile
hero = {0,0,{0,0}}; // this also does not compile
}
答案 0 :(得分:3)
您的'此编译'行是正确的;这是一个初始化。其他两行不编译,因为它们不是初始化,而是分配。如果您使用的是足够新版本的C,则可以使用复合文字进行分配:
hero.location = (loc){0,0};
hero = (person){0,0,{0,0}};
注意 - person hero
中的InitializeHero
声明会影响全局变量;你可能不想那样。
person
中的一些字段吗?这些都不应该用您所展示的内容进行编译。
答案 1 :(得分:1)
您指示编译的行会产生警告。让我们分开您的InitializeHero
功能。
person hero = {0,0, {0,0}};
在这里,您要实例化名为person
的新hero
结构。您使用大括号初始化方法来设置结构的成员。在这种情况下,person
的唯一成员是loc
。 loc
本身只有两个uint8_t
。在这里使用大括号初始化方法,您只需使用{0, 0}
。
结合这两个,您可以编写如下语句:
person hero = {{0, 0}};
请注意,初始化时只能使用大括号初始化。您的其他两个陈述是分配。此时结构已经初始化,这就是为什么这两个语句不能编译。
另外请注意,您的全局变量static person hero
已被hero
中的本地变量InitializeHero
所遮蔽。这意味着您要在person
中创建单独的InitializeHero
结构。但是,此静态变量在此情况下被声明为初始化,因此您的语句必须读取
static person hero = {{0, 0}};
...未使用InitializeHero
。