簡體   English   中英

在沒有現有定義的情況下使用 typedef 意味着什么

[英]what does using typedef mean when used without an existing definition

我正在查看帶有以下語句的頭文件:

typedef struct my_server_t my_server_t;

據我了解typedef ,它們用於簡化數據結構的定義並為另一種數據類型提供別名。 所以在以下語句中:

typedef struct {
   int port;
} my_server;

my_server my_server_t;

my_server_tmy_server類型。

但是頭文件中沒有my_server_t定義,我該如何解釋?

您可以在 C 中使用未知定義轉發聲明並使用它,只要不需要大小或成員(例如,您可以使用指向它的指針或類似的指針)。

typedef 沒有改變任何東西,它只是說my_server_tstruct my_server類型。 不必知道結構體的定義。

但是一旦您需要定義(即顯式或隱式使用該結構的大小或成員),如果尚未定義,您將收到錯誤( incomplete type )。

如果標頭(或通常的翻譯單元)使用struct my_server_t但不包含它的定義,則struct my_server_t不完整的類型。 編譯器知道它是一個結構,但它不知道里面有什么或它有多大。

您不能定義這種類型的對象: struct my_server_t x; 會失敗,因為編譯器不知道要為x使用多少空間。

但是,您可以擁有指向不完整類型的指針。 所有結構的指針都具有相同的大小和表示形式,因此編譯器有足夠的信息來為struct my_server_t生成指針,即使它不知道struct my_server_t的大小。 這意味着您可以調用在另一個翻譯單元中定義的例程,該單元對struct my_server_t有完整的定義。 該例程可以創建一個struct my_server_t (通過使用malloc或通過定義一個靜態對象或通過其他方式)並返回一個指向它的指針。 然后您可以通過調用其他知道如何處理它的例程來使用該結構。

因此,沒有定義的結構為例程庫提供了一種讓其用戶請求和使用信息的方式,而無需向用戶透露如何維護信息的內部細節。

my_server_t定義為typedef struct my_server_t my_server_t; 只是提供一個方便的名稱來用於類型。 它根本不影響結構的含義或定義。

如果你看到類似的東西:

typedef struct my_server_t my_server_t;

然后, struct my_server_t可能在某處定義,而my_server_t將是它的別名。

如果您在正在查看的頭文件中找不到它,那么它很可能會在您正在查看的頭文件中包含的某個其他頭文件中定義。 甚至,它可以定義在其他一些頭文件中,該頭文件包含在您正在查看的頭文件之一中,等等(考慮任何級別的頭文件嵌套)。

暫無
暫無

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

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