簡體   English   中英

C向前聲明typedef結構

[英]C forward declaration for typedef struct

我正在嘗試向前聲明typedef結構輪。

typedef struct wheels wheels;

typedef struct car {
  float topSpeed;
  wheels w;
} car;

typedef struct wheels {
  int frontWheels;
  int backWheels;
} wheels; 

int main() {
  car c = {
    .topSpeed = 255.0,
    .w = {
      .frontWheels = 2,
      .backWheels = 2,
    }
  };

  return 0; 
}

這給了我以下錯誤:

錯誤:字段“ w”的車輪w的類型不完整;

錯誤:字段名稱不在記錄或聯合初始化程序中。frontWheels= 2

錯誤:字段名稱不在記錄或聯合初始化程序中。backWheels= 2

我知道我可以將整個typedef struct車輪移到typedef struct車上方,並且它可以工作。

如何正確聲明結構輪?

以下是C標准的相關部分(添加了重點):

§6.2.5p1

在翻譯單元內的各個點,對象類型可能不完整(缺少足夠的信息來確定該類型對象的大小)或完整(具有足夠的信息)。

§6.7.2p3

結構或聯合不得包含具有不完整或函數類型 的成員 (因此,結構不應包含其自身的實例,但可以包含指向其自身的實例的指針),但結構的最后一個成員具有大於一個命名成員可能具有不完整的數組類型; 這樣的結構(以及任何可能包含遞歸的此類結構的並集的聯合)不應是結構的成員或數組的元素。

第一個typedef聲明一個不完整的類型,稱為wheels car結構使用該不完整類型作為成員。 這是標准明確禁止的。

這就是第一條錯誤消息告訴您的內容。 其他兩個錯誤消息只是噪音。 它們是由於編譯器沒有足夠的信息來完成car結構的結果。

如另一個答案中所述,不完整類型的用途之一是聲明指針。 例如,鏈表中的一個節點,其中結構包含指向其自身的指針:

typedef struct node Node;   // struct node and Node are incomplete types here

struct node
{
    int value;
    Node *next;             // using an incomplete type to declare a pointer
};                          // struct node and Node are complete from here forward

您只能擁有指向不完整的前向定義結構或聯合的指針

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM