[英]Typedef-ing nonexisting struct in c
我目前正在學習指針和結構,我無法理解以下內容
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
為什么這段代碼不會引發錯誤?
當我使用創建原子時
atom x;
printf("%d", x.element);
它將打印5。
我不了解不存在的結構的類型定義,這如何工作?
typedef struct at atom;
在這里,你聲明 struct
稱為at
,給它一個typedef
的atom
。 因此,這是完全有效的C。
struct at {
int element = 5;
struct at *next;
}
在這里,你所定義的結構at
你前面聲明。
注意:
重要的是要注意,在C語言中,不允許像在此處那樣在結構中初始化變量:
struct at {
int element = 5; // <---- Illegal in C
struct at *next;
}
但是 ,這在C ++中完全可以,因此,如果您嘗試使用C,請刪除變量初始化,但是如果您使用的是C ++,那么就很好了。
這是一個前向聲明-在C語言中,您可以聲明一個命名的事物將存在,而無需提供任何詳細信息,直到稍后; 這是最常見的允許知識循環的方式; 例如struct A
有一個指向struct B
的指針, struct B
有一個指向struct C
的指針,而struct C
有一個指向struct A
的指針。 在這種特定情況下,只要您已經說過這些東西都是結構,那么編譯器就會對類型有足夠的了解,從而知道合適的指針將是什么樣。
在這種情況下,您已經聲明將有一個名為的結構at
並且您希望將其稱為atom
。 如果你嘗試聲明一個atom
告訴編譯器什么之前struct at
的模樣,那會是一個錯誤。 但是在此之前,編譯器具有足夠的信息來繼續進行。
你忘了分號了
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
^^^^
考慮到它是C ++代碼。 在C語言中,您可能無法在其定義內初始化結構的數據成員。
這個宣言
typedef struct at atom;
聲明兩件事。 首先,它在當前聲明區域中聲明新類型的struct at
。 並且為該類型的atom
聲明別名
每個聲明不必同時是一個定義。
首先聲明struct at
然后定義
struct at {
int element = 5;
struct at *next;
};
比較這種方法和功能。 函數也可以聲明多次,而只能定義一次。 例如
void f();
void f();
//...
void f();
void f() { std::cout << "It is a joke" << std::endl; }
以相同的方式可以多次聲明一個結構,但是只定義一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.