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

C 在没有现有定义的情况下使用typedef意味着什么,c,typedef,C,Typedef,我正在查看带有以下语句的头文件: typedef struct my_server_t my_server_t; 据我对typedef的了解,它们用于简化数据结构的定义,并为另一种数据类型提供别名。因此,在以下声明中: typedef struct { int port; } my_server; my_server my_server_t; my\u server\t属于my\u server类型 但是,由于头文件中没有my\u server\t的定义,我该如何解释它呢?如果您看到

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

typedef struct my_server_t my_server_t;
据我对
typedef
的了解,它们用于简化数据结构的定义,并为另一种数据类型提供别名。因此,在以下声明中:

typedef struct {
   int port;
} my_server;

my_server my_server_t;
my\u server\t
属于
my\u server
类型


但是,由于头文件中没有
my\u server\t
的定义,我该如何解释它呢?

如果您看到如下内容:

typedef struct my_server\t my_server\t;
然后,
struct my\u server\t
可以在某个地方定义,
my\u server\t
将是它的别名


如果您在正在查看的头文件中找不到它,那么,很可能会在您正在查看的头文件中包含的其他头文件中定义它。甚至,它可以在包含在您正在查看的头文件中的某个头文件中的其他头文件中定义,等等(考虑头文件嵌套的任何级别)。

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

typedef没有改变任何东西,它只是说,
my\u server\t
struct my\u server
类型。struct的定义不必知道

但是,一旦您需要定义(即显式或隐式使用此结构的大小或成员),如果尚未定义,您将得到一个错误(
不完整类型
)。

如果标题(或通常的翻译单位)使用
struct my_server_t
但不包含它的定义,则
struct my_server_t
是一个不完整的类型。编译器知道它是一个结构,但不知道其中包含什么或它有多大

无法定义此类型的对象:
struct my_server\u t x;
将失败,因为编译器不知道要为
x
使用多少空间

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

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


my\u server\t
定义为具有
typedef struct的类型名my\u server\t my\u server\t;
仅为类型提供了一个方便的名称。它根本不会影响结构的含义或定义。

您确定它没有在其他头文件中定义吗?如果没有(类型)头中的
my_server_t
定义,这只是一个变量声明。如果从头中可以看到
my_server_t
的typedef,则可能会出现编译错误。“
struct my_server_t
应该在某个地方定义”这不是真的,它不是必需的。在CThanks中有一种称为转发声明的东西,我已经更新了答案以便更准确。我什么时候可以定义
my_服务器\u t
?相反,我应该如何定义
my_服务器\u t
?你能举个例子吗?让我们在结构中说,我想要一个端口号和对s的引用ome函数。如何处理头文件中已经给出的转发定义?请注意,“转发声明”不是标准使用的术语,它只是说“声明”(因为添加“转发”是多余的)@Amanda您可以稍后在
struct my_server_t{int x;}上编写;