循环结构声明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 字段。