簡體   English   中英

c中的Typedefing不存在的結構

[英]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 ,給它一個typedefatom 因此,這是完全有效的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.

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