C语言结构体定义报错:‘Genre’未定义类型问题咨询
解决‘Genre’ does not name a type 报错问题
嘿,这个报错的核心原因其实挺直观的——C语言是按顺序编译代码的,当编译器处理你的Song结构体定义时,还没看到后面的Genre枚举类型定义,自然就不知道Genre是什么东西啦!
你的代码里把Genre的枚举定义放在了Song结构体之后,编译器从上到下读代码,读到Genre genre;这一行时,Genre这个类型还没被声明或定义,所以就抛出了这个错误。
两种有效的解决办法:
把
Genre枚举定义移到Song结构体前面
这是最直接的方式,让编译器先认识Genre类型,再处理用到它的结构体:// 先定义歌曲流派的枚举 typedef enum { ROCK = 0, RAP, POP, METAL } Genre; // 再定义歌曲的结构体 typedef struct song { int id_playlist; char *artist; Genre genre; double duration; char *name; struct song *next; } Song; Song *New_song(char *name, char *artist, double duration, Genre genre); void Print_song(Song *song);提前声明
Genre类型
如果因为某些原因不想调整代码顺序,可以先给Genre做一个类型声明,告诉编译器“后面会有这个类型的定义”:// 提前声明Genre类型 typedef enum Genre Genre; // 歌曲的结构体定义 typedef struct song { int id_playlist; char *artist; Genre genre; double duration; char *name; struct song *next; } Song; // 再补全Genre的枚举定义 typedef enum Genre { ROCK = 0, RAP, POP, METAL } Genre; Song *New_song(char *name, char *artist, double duration, Genre genre); void Print_song(Song *song);
两种方法都能解决这个问题,第一种更简洁直观,推荐优先使用~
内容的提问来源于stack exchange,提问作者Pasman




