基本上,编译器会抱怨未知类型名称"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编译器在一次从上到下的过程中解析预处理的代码。
这意味着任何对象或类型在使用之前都必须先定义。