gpt4 book ai didi

c - 如何使用匿名 union 在另一个结构中定义 typedef 结构?

转载 作者:行者123 更新时间:2023-11-30 18:33:03 25 4
gpt4 key购买 nike

我想表示一个嵌套的 ast 节点

typedef struct ast_assignment
{
char* sym;
ast_node* value;
} ast_assignment;

typedef struct ast_conjunction
{
char* sym;
ast_node* value;
} ast_conjunction;

typedef struct ast_node {
int node_type;
union {
ast_assignment data;
ast_conjunction data;
};
} ast_node;

但是无论我首先定义什么,编译器都会告诉我另一个结构是未知类型?如何进行?

最佳答案

  • Typedef 必须描述实际的类型名称
  • Typedef 需要 ;在他们之后
  • 圆形类型引用需要一些特殊的调味料
  • union 需要不同的成员名称

您的意思可能是:

struct ast_node; // forward declaration

typedef struct {
char* sym;
struct ast_node* value;
} ast_assignment;

typedef struct ast_conjunction {
char * sym;
struct ast_node* value;
} ast_conjunction;

typedef struct ast_node {
int node_type;
union {
ast_assignment data_asg;
ast_conjunction data_conj;
};
} ast_node;

对此进行一些扩展以获得更完整的答案。

首先,typedef 的目的是将一个新名称安装到您可以使用的编译器中,因此 typedef struct { ... };确实没什么作用。应该是typedef struct {...} newtype;所以你可以使用实际名称 newtype .

后面还需要一个分号,这让我每次从 C# 返回到 C 时都感到困惑:-)

循环引用的事情很棘手,做struct mytype;提前意味着您可以使用该名称 mytype 仅当它处于不需要了解结构细节知识的上下文中。实际上,这意味着您可以使用struct mytype *作为指针 - 因为这是固定大小 - 但这是不允许的:

struct ast_node; // forward declaration

struct some_other_type {
struct ast_node *nodeptr; // this is ok
struct ast_node thisnode; // FAIL
...
};

原因是:指针无论指向什么类型的数据都是固定大小的,因此编译器会带你一点,但是thisnode需要了解所有细节。抱歉,没有办法做到这一点。

回复: union 体,你不能定义任何unionstruct有两个同名的成员,因为你如何引用其中一个并且编译器知道是哪一个?

就我个人而言,我不喜欢使用 typedef对于结构类型,所以我会这样做:

struct ast_node; // forward struct defn

struct asg_assignment {
char *sym;
struct ast_node *value;
};

struct ast_conjunction {
char * sym;
struct ast_node* value;
};

struct ast_node {
int node_type;
union {
struct ast_assignment data_asg;
struct ast_conjunction data_conj;
};
};

...但我不确定除了个人喜好之外我还能用其他什么理由来证明这一点。

关于c - 如何使用匿名 union 在另一个结构中定义 typedef 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59711072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com