You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动