如何处理C中的typedef数据类型(一般来说)



基本上,编译器会抱怨未知类型名称"Song_t",因为数据类型定义发生在首次引用之后。

struct Cell { Song_t song;
struct Cell *pnext;
};
typedef struct Song Song_t;

如果我把typedef放在前面,它就会工作。因此,是否通常建议将typedef放在每个文件的开头?

在定义typedef名称之前,不能引用该名称。

将typedef移到struct Cell定义之前,或者在struct Cell定义中使用struct Song

因此,是否通常建议在每个文件的开头放置typedef?

不一定,您可以通过编码来避免typedef-s

struct Cell { 
struct Song song;
struct Cell *pnext;
};

当然,struct Song应该被定义为";在";(考虑到C预处理器(。

你也可以对进行编码

typedef struct Song Song_t;
typedef struct Cell Cell_t;

稍后只使用Song_t等。您必须(稍后(提供struct Song的定义(而不仅仅是前向声明(。有关详细信息,请阅读现代C,请参阅此C参考网站和C11标准n1570。

从Linux内核或简单C编译器(如nwcc(或GTK工具包的源代码中寻找灵感。所有这些(大部分(都是在C中编码的。也可以在github上查找示例。还研究了GCC的源代码。它是一个流行的C编译器(它的旧版本,例如GCC 4.4,大部分都是用C编写的(。

C编译器在一次从上到下的过程中解析预处理的代码。

这意味着任何对象或类型在使用之前都必须先定义。

最新更新