在没有现有定义的情况下使用 typedef 意味着什么

Ama*_*nda 3 c typedef

我正在查看带有以下语句的头文件:

typedef struct my_server_t my_server_t;
Run Code Online (Sandbox Code Playgroud)

据我了解typedef,它们用于简化数据结构的定义并为另一种数据类型提供别名。所以在以下语句中:

typedef struct {
   int port;
} my_server;

my_server my_server_t;
Run Code Online (Sandbox Code Playgroud)

my_server_t是 类型my_server

但是my_server_t头文件中没有存在的定义,我如何解释它?

Ctx*_*Ctx 6

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

typedef 没有改变任何东西,它只是说,那my_server_t是 type struct my_server。不必知道结构体的定义。

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


Eri*_*hil 6

如果标题(或通常的翻译单元)使用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;只是提供了一个方便的名称来用于类型。它根本不影响结构的含义或定义。