簡體   English   中英

這兩個在 C 編程語言中是否相同?

[英]Are these two the same in C programming language?

請問這兩者的語法是否相同? 我一直感到困惑,因為 typedef 構造在花括號閉合后具有結構名稱,但在這里,變量名稱似乎是在花括號閉合后定義的變量名稱。

struct{
   int age;
   float height;
}person1,*personPtr;

VS

struct person{
   int age;
   float height;
};

struct person person1;
struct person *personPtr;

在這份聲明中

struct{
   int age;
   float height;
}person1,*personPtr;

聲明了一個未命名的結構,一個結構類型的 object 和一個指向結構類型的 object 的指針。

您將無法在程序中引用結構類型,因為它是未命名的。

這些聲明

struct person{
   int age;
   float height;
};

struct person person1;
struct person *personPtr;

與前面的聲明的不同之處在於聲明了一個可以在程序中引用的命名結構。

如果第一個聲明將被重寫,則代碼片段將是等效的

struct person{
   int age;
   float height;
}person1,*personPtr;

其他答案解決了這個問題: “這兩者的語法是否相同?” . 在這里,我將重點介紹以下聲明:

“我一直感到困惑,因為 typedef 構造在花括號關閉后具有結構名稱,但在這里似乎變量名稱是定義的名稱......”

因此,盡管您的帖子實際上並未包含顯示typedef struct {的片段,但我將在此處包含一個片段以幫助識別兩種情況之間的差異,即未命名structtypedef struct

typedef之間的區別,例如...

typedef struct{
   int age;
   float height;
} person_s; //creates a new type "person_s"

person_s person1; //illustrates using new type to create an instance of the struct

...和一個類似於您的未命名結構的:(為了簡化,省略了指針實例)

struct{
   int age;
   float height;
}person1;// create single instance of struct, but this instance 
         // cannot be used to create new instances

...是typedef版本創建了一個新的數據類型person_s person_s可用於在代碼中的任何位置創建該結構的新實例,在創建它的 scope 中。
而未命名struct僅創建未命名結構的一個實例。 雖然實例person1可以在代碼的多個位置使用和引用(僅受創建它的 scope 限制。)但是除了初始實例person1之外,不能創建未命名結構的新實例。

所以總而言之,
person1是未命名結構的單個實例,而person_s是全新的類型。 新類型可用於創建該變量的新實例,就像任何其他類型一樣。 (例如intfloat ,...),但不能創建未命名結構的新實例。

請問這兩者的語法是否相同?

不,他們不是。

第一個版本聲明了一個匿名結構(因為它沒有名稱)和兩個使用該類型的變量,

第二個版本命名類型,然后使用類型名稱來聲明變量。

我一直感到困惑,因為 typedef 構造在花括號閉合后具有結構名稱,但在這里,變量名稱似乎是在花括號閉合后定義的變量名稱。

是的,變量聲明和 typedef 聲明被設計為非常相似,這是故意的。

例如, int age; 聲明一個名為age的變量。 通過在聲明前添加 typedef,如typedef int age; 相反,我們將age類型而不是變量。 然后我們可以使用它來聲明一個變量

age   my_age;

如同

int   my_age;

結構也一樣

struct
{
   int age;
   float height;
} person;

聲明一個變量person ,而

typedef struct
{
   int age;
   float height;
} person;

說那person是一種類型。

使 typedef 聲明看起來與變量聲明非常相似的設計在當時似乎是個好主意,但也許不是。 比輝煌更令人困惑?

暫無
暫無

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

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