【问题标题】:C nested structs in correlation相关的 C 嵌套结构
【发布时间】:2017-02-03 09:27:45
【问题描述】:

我有以下代码:

#define MAX_VIDEOS 100

typedef struct video_t {
    int likes;
    int dislikes;
    char* title;
    user_t* uploader;
} video_t;

typedef struct user_t {
    char* username;
    char* password;
    video_t videos[MAX_VIDEOS];
} user_t;

我想在video_t 中使用user_t,反之亦然。

在任何情况下,gcc 都会说"unknown type name"

youtube.c:9:5:错误:未知类型名称“user_t”

user_t* uploader;
  ^

这很正常,但我想不出办法解决这个问题。

【问题讨论】:

  • 你需要事先声明它们(作为原型)

标签: c struct declaration


【解决方案1】:

你需要转发声明 user_t:

#define MAX_VIDEOS 100

typedef struct user_t user_t;

typedef struct video_t {
    int likes;
    int dislikes;
    char* title;
    user_t* uploader;
} video_t;

typedef struct user_t {
    char* username;
    char* password;
    video_t videos[MAX_VIDEOS];
} user_t;

【讨论】:

  • 感谢大家的快速解答,完美解决了我的问题。
  • 这里的前向声明是不是有点误导?我会说定义
  • @SouravGhosh:它是not a definition。这是一个前向声明 + typedef
  • 对,但是 user_t 是定义的(作为 typedef 的结果),我不是在谈论 struct user_t
【解决方案2】:

转发声明user_t 类型别名:

typedef struct user_t user_t;

之后,您可以在video_t 结构中使用user_t *uploader

【讨论】:

    【解决方案3】:

    第一个struct不知道user_t的签名(转发声明)

    改成

    #define MAX_VIDEOS 100
    
    typedef struct user_t user_t;
    
    typedef struct video_t {
        int likes;
        int dislikes;
        char* title;
        user_t* uploader;
    } video_t;
    
    struct user_t {
        char* username;
        char* password;
        video_t videos[MAX_VIDEOS];
    };
    

    【讨论】:

      【解决方案4】:

      将缺失类型的类型定义移到开头。这确保编译器在使用时知道 type

      类似

       typedef struct user_t user_t;
      

      然后,稍后,只需声明结构,typedef 已经存在。

      开头显示的sn -p 可以解决问题。这样

      • 在声明 struct video_t 时,user_t 是已知的,并且 typedef video_t 已定义。
      • 在声明 struct user_t 时,video_t 是已知的。

      所以,两端相遇。

      【讨论】:

        猜你喜欢
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多