'->'不适用于结构内部的结构

叶梅拉
typedef struct {
    char name[3];
    bool initial_state;
    bool final_state;
    struct TRANSITION *transitions;
    int numberTransition;
} STATE;

typedef struct {
    char c;
    struct STATE *destination;
} TRANSITION;

STATE *create_state(char *name, bool is_initial, bool is_final);
void add_transition(STATE *source, char sign, STATE *dest);
void destroy_state(STATE **pp_state);

int main(void) {
    STATE *state1 = create_state("S'0", true, false);
    STATE *state2 = create_state("S'1", true, false);
    STATE *state3 = create_state("S'2", true, false);
    printf("%s  ", state1->name);
    printf("%d  ", state1->initial_state);
    printf("%d  ", state1->final_state);
    add_transition(state1, 'A', state2);
    TRANSITION *transitions = state1->transitions;
    printf("%c  ", transitions[0].c);
}

如您所见,我访问了该state1结构。而它的实际工作为nameinitial_statefinal_state但是由于某种原因它不适用于state1->transitions我想是因为它本身是一个结构,所以我必须做些其他的事情。

这行有什么问题?:

TRANSITION *transitions = state1->transitions;
一些程序员哥们

问题在于结构名称(如)struct STATE位于其自己的名称空间中,与类型别名存在的C名称空间的其余部分分开(通过类型别名,我指的是用创建的符号typedef)。

如果你这样做

typedef struct STATE_STRUCTURE { ... } STATE_TYPE;

您定义了两个不同的符号,首先是结构名称STATE_STRUCTURE,然后是type-alias STATE_TYPE要使用STATE_STRUCTURE您的struct关键字,请使用

struct STATE_STRUCTURE *state;

在没有实际定义结构名称的情况下,您不能使用结构名称。这就是您在结构定义中所缺少的。

还要注意,由于结构名称位于它们自己的名称空间中,就像我之前说的那样,您可以使结构名称与类型别名相同:

typedef struct STATE { ... } STATE;

对于您的问题,我建议的解决方案是使用结构和类型别名的正向声明

typedef struct STATE STATE;
typedef struct TRANSITION TRANSITION;

这告诉编译器存在具有名称STATE和的结构TRANSITION,并且还具有相同名称的那些结构的类型别名。

然后,您只需定义结构本身,并且由于我们已经声明了类型别名,因此可以在结构内部使用它们:

struct STATE
{
    char name[3];
    bool initial_state;
    bool final_state;
    TRANSITION *transitions;
    int numberTransition;
};

struct TRANSITION
{
    char c;
    STATE *destination;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring AOP不适用于MVC结构

SwiftUI绑定不适用于子层次结构

静态构造函数不适用于结构

结构型铸造不适用于String吗?

uniScaleTransform不适用于定制控件结构4.1.0

日期格式不适用于kendo层次结构网格

结构更新语法不适用于借用数据

共享内存不适用于结构,但适用于char *

为什么“不能泄漏私有类型”仅适用于结构而不适用于枚举?

将临时结构值传递给函数适用于 Mac,但不适用于 Windows

单击不适用于内部div

简单的D3演示不适用于更改的结构

结构初始化符号不适用于堆分配的存储

调用层次结构不适用于类名称或变量Android Studio

样式组件不适用于层次结构选择器

分配/强制转换更特定类型的IEnumerable <object>不适用于结构

jQuery最近的()不适用于层次结构中的下一个元素

CSS悬停不适用于绝对定位的元素的层次结构

JSON Unmarshal不适用于由Relect创建的动态结构

追加不适用于定义为结构类型切片的命名类型

使用JNA的USBFS IOCTL调用不适用于64位体系结构

导航体系结构组件:过渡动画不适用于对话框

forEach不适用于ExtReact存储中的数据项结构

C ++结构化绑定不适用于位集

vsprintf 函数不适用于结构二维数组

模式弹出窗口不适用于分层组件结构angular-bootstrap-md

Solr 7.7 JSON转换器不适用于结构的转义数组

只有1个实例时,Snowflake XML解析不适用于嵌套结构

谷歌机器人只显示用于移动设备的HTML结构,不适用于CSS。为什么?