在没有现有定义的情况下使用 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_t
是 my_server
类型。
但是头文件中没有 my_server_t
的定义,我要从中解释什么?
如果您看到类似这样的内容:
typedef struct my_server_t my_server_t;
那么,struct my_server_t
可以在某处定义,my_server_t
就是它的别名。
如果您无法在您正在查看的头文件中找到它,那么,很可能它将在包含在其中的某个其他头文件中定义你正在观看。或者甚至,它可以在其他一些头文件中定义,这些头文件包含在您正在查看的头文件中的一个头文件中,等等(考虑任何级别的头文件嵌套)。
您可以在 C 中转发声明一个具有未知定义的结构并使用它,只要不需要大小或成员(例如,您可以使用指向它的指针或类似的)。
typedef 没有改变任何东西,它只是说 my_server_t
是 struct 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;
的类型名称只是为该类型提供了一个方便的名称。它根本不影响结构的含义或定义。
我正在查看包含以下语句的头文件:
typedef struct my_server_t my_server_t;
据我了解typedef
,它们用于简化数据结构的定义并为另一种数据类型提供别名。所以在下面的语句中:
typedef struct {
int port;
} my_server;
my_server my_server_t;
my_server_t
是 my_server
类型。
但是头文件中没有 my_server_t
的定义,我要从中解释什么?
如果您看到类似这样的内容:
typedef struct my_server_t my_server_t;
那么,struct my_server_t
可以在某处定义,my_server_t
就是它的别名。
如果您无法在您正在查看的头文件中找到它,那么,很可能它将在包含在其中的某个其他头文件中定义你正在观看。或者甚至,它可以在其他一些头文件中定义,这些头文件包含在您正在查看的头文件中的一个头文件中,等等(考虑任何级别的头文件嵌套)。
您可以在 C 中转发声明一个具有未知定义的结构并使用它,只要不需要大小或成员(例如,您可以使用指向它的指针或类似的)。
typedef 没有改变任何东西,它只是说 my_server_t
是 struct 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;
的类型名称只是为该类型提供了一个方便的名称。它根本不影响结构的含义或定义。