我写了一个结构体
struct Tree{
struct Node *root;
struct Node NIL_t;
struct Node * const NIL; //sentinel
}
我想要
struct Node * const NIL = &NIL_t;
我无法在结构体内部初始化它。 我使用的是MSVS,语言是C而不是C++。 我知道在C ++中可以使用初始化列表。 如何在C中实现?
我写了一个结构体
struct Tree{
struct Node *root;
struct Node NIL_t;
struct Node * const NIL; //sentinel
}
我想要
struct Node * const NIL = &NIL_t;
我无法在结构体内部初始化它。 我使用的是MSVS,语言是C而不是C++。 我知道在C ++中可以使用初始化列表。 如何在C中实现?
struct Tree t = { .root = NULL, .NIL = &t.NIL_t };
#define TreeDecl(id, rt) struct Tree id = { .root = rt, .NIL = &id.NIL_t }
- Chris Lutzstruct Tree t = { NULL, { 0 }, &t.NIL_t };
。 - Chris DoddNIL
成员在NIL_t
成员之前,然后使用struct Tree t = { NULL,&t.NIL_t };
。 - caf对于那些寻求简单例子的人,这里有一个:
最初的回答:
#include <stdio.h>
typedef struct {
const int a;
const int b;
} my_t;
int main() {
my_t s = { .a = 10, .b = 20 };
printf("{ a: %d, b: %d }", s.a, s.b);
}
(产生以下输出)
{ a: 10, b: 20 }
结构体定义了一个数据模板,但本身没有数据。由于它没有数据,因此无法初始化。
另一方面,如果您想声明一个实例,您可以对其进行初始化。
struct Tree t = { NULL, NULL, NULL };
NIL_t
是一个 struct Node
,而不是 struct Node *
,所以它可能不会被初始化为 NULL
。我建议您创建一个 struct Tree *init(...)
函数(或者如果您喜欢的话,可以创建一个 void init(struct Tree *t, ...)
函数或宏)来为您完成这种工作。 - Chris Lutzstruct
,你可以使用 struct Tree t = { NULL, { /* 在此处放置 struct Node 的内容 */ }, NULL }
(或者对于最后一个,使用 &t.NIL_t
)。 - Chris Lutzstruct Tree
内部的struct Node
。在这种情况下不会无限递归。(如果它是无限递归的话,那就是个问题了。但这不是OP的情况。) - Chris Lutz也许这样就足够了吧?
struct {
struct Node * const NIL;
struct Node *root;
struct Node NIL_t;
} Tree = {&Tree.NIL_t};