循环结构声明C
Circular structure declaration C
我必须声明一个依赖于另一个结构声明的结构,但是 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的列表。如何解决这个问题,最好不要对代码进行太大的更改?
只需在定义前加上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
而不是 header,从而对潜在的结构用户隐藏结构定义,添加访问器 get/set 与函数一样,您可以在 struct
被有效隐藏的同时添加功能,这是一种非常常见的技术,具有许多好处,例如避免滥用给定的 struct
字段。
我必须声明一个依赖于另一个结构声明的结构,但是 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的列表。如何解决这个问题,最好不要对代码进行太大的更改?
只需在定义前加上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
而不是 header,从而对潜在的结构用户隐藏结构定义,添加访问器 get/set 与函数一样,您可以在 struct
被有效隐藏的同时添加功能,这是一种非常常见的技术,具有许多好处,例如避免滥用给定的 struct
字段。