【问题标题】:Unknown type name in C linked list structureC链表结构中的未知类型名称
【发布时间】:2020-12-03 13:32:17
【问题描述】:

我在头文件中有这样的结构:

typedef struct {
    LIGNE *precedent;
    PERSONNE individu;
    LIGNE *suivant;
} LIGNE;

但是当我编译时,我得到了这个错误:

error: unknown type name ‘LIGNE’
  LIGNE *precedent;
  ^~~~~
error: unknown type name ‘LIGNE’
  LIGNE *suivant;

我不明白问题出在哪里。

【问题讨论】:

  • 欢迎来到 SO。 LIGNE 在结构完成之前是未知的。您必须提供一个结构标签并在结构内使用它:typedef struct LIGNE{... struct LIGNE *suivant;} LIGNE; 标签名称可以与类型名称相同或不同。注意:LIGNEstruct LIGNE 不同!
  • @Gerhardh 它有效,谢谢。我尝试了typedef struct LIGNEstruct LIGNE *suivant,但没有同时尝试过哈哈。

标签: c gcc data-structures compiler-errors linked-list


【解决方案1】:

正如注释和Tomo Ceferin 的回答中所说,您的编译器直到第5 行才知道LIGNE 是什么。

一种解决方案是在声明之前对您的结构进行 typedef:

typedef struct S_LIGNE LIGNE;

struct S_LIGNE {
    LIGNE *precedent;
    PERSONNE individu;
    LIGNE *suivant;
};

这样,您的编译器就知道LIGNEstruct S_LIGNE 的类型定义。

【讨论】:

    【解决方案2】:

    设身处地为编译器着想:

    1: typedef struct {
    2:     LIGNE *precedent;
    3:     PERSONNE individu;
    4:     LIGNE *suivant;
    5: } LIGNE;
    

    在第 2 行中,您说您想要一个指向 LIGNE 类型的指针。这对编译器来说是个问题,因为直到第 5 行它才知道 LIGNE 是什么。当然,这是编译器有点笨。指向任何东西的指针大小相同,因此就结构布局而言,这无关紧要。但是,C 编译器想知道这是什么类型的指针。 正如@Gerhardh 建议的那样,您可以通过在第 2 行和第 4 行加上 struct 前缀来欺骗它。编译器看到这一点并将其读取为指向结构的指针,突然不再关心它对此一无所知。

    【讨论】:

      【解决方案3】:

      这会起作用

      typedef struct {
          struct LIGNE *precedent;
          PERSONNE individu;
          struct LIGNE *suivant;
      } LIGNE;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多