在没有现有定义的情况下使用 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 的定义,我要从中解释什么?

如果您看到类似这样的内容:

typedef struct my_server_t my_server_t;

那么,struct my_server_t 可以在某处定义my_server_t就是它的别名。

如果您无法在您正在查看的头文件中找到它,那么,很可能它将在包含在其中的某个其他头文件中定义你正在观看。或者甚至,它可以在其他一些头文件中定义,这些头文件包含在您正在查看的头文件中的一个头文件中,等等(考虑任何级别的头文件嵌套)。

您可以在 C 中转发声明一个具有未知定义的结构并使用它,只要不需要大小或成员(例如,您可以使用指向它的指针或类似的)。

typedef 没有改变任何东西,它只是说 my_server_tstruct my_server 类型。不必知道结构的定义。

但是一旦您需要定义(即显式或隐式使用此结构的大小或成员),如果尚未定义,您将收到错误消息 (incomplete type)。

如果 header(或通常的翻译单元)使用 struct my_server_t 但不包含它的定义,那么 struct my_server_t 不完整的 类型。编译器知道它是一个结构体,但不知道里面有什么,也不知道它有多大。

您不能定义这种类型的 object:struct my_server_t x; 会失败,因为编译器不知道要为 x.[=21 使用多少 space =]

但是,您可以拥有指向不完整类型的指针。所有结构的指针都具有相同的大小和表示形式,因此编译器有足够的信息为 struct my_server_t 创建指针,即使它不知道 struct my_server_t 的大小。这意味着您可以调用另一个翻译单元中定义的例程,该单元具有 struct my_server_t 的完整定义。该例程可以创建一个 struct my_server_t(通过使用 malloc 或通过定义静态 object 或其他方式)和 return 指向它的指针。然后,您可以通过调用知道如何处理它的其他例程来使用该结构。

因此,没有定义的结构为例程库提供了一种方式,让其用户请求和使用信息,而无需向用户透露信息维护方式的内部细节。

my_server_t 定义为带有 typedef struct my_server_t my_server_t; 的类型名称只是为该类型提供了一个方便的名称。它根本不影响结构的含义或定义。