我必须声明一个依赖于另一个结构声明的结构,但是gcc一直在抱怨,我已经达到了一个我无法通过简单地移动代码来解决它的问题。这是合约:
typedef struct inodes
{
unsigned short int numInode;
ListaBlocos *blocos;
ListaInodes *filhos;
Meta metaDados;
unsigned short int tempo;
} Inode;
typedef struct listablocos
{
Bloco bloco;
struct listablocos *prox;
} ListaBlocos;
typedef struct listainodes
{
Inode inode;
struct listainodes *prox;
} ListaInodes;
基本上,ListaInodes是一个包含Inode类型实例的列表。所以我必须在它之前声明Inode。但如果我这样做,gcc会抱怨这个:
error: unknown type name 'ListaInodes'
因为Inode的其中一个字段是其他Inode的列表。如何修复,最好不要对代码进行过多的修改?
答案 0 :(得分:3)
只需在定义之前添加typedef
。
typedef struct listainodes ListaInodes;
typedef struct inodes Inode;
typedef struct listablocos ListaBlocos;
struct inodes
{
unsigned short int numInode;
ListaBlocos *blocos;
ListaInodes *filhos;
Meta metaDados;
unsigned short int tempo;
};
struct listablocos
{
Bloco bloco;
ListaBlocos *prox;
};
struct listainodes
{
Inode inode;
ListaInodes *prox;
};
如您所见,您甚至可以在实现文件中定义struct
而不是标题,从而将结构定义隐藏在潜在的结构用户中,添加accessor get / set之类的函数,您可以添加功能而struct
被有效隐藏,这是一种非常常见的技术,有许多好处,例如避免滥用给定的struct
字段。