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
结构。而它的实际工作为name
,initial_state
和final_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] 删除。
我来说两句