我是C编程的初学者,我知道struct type declaration和typedef struct declaration之间的区别 . 我遇到了一个答案,说如果我们定义一个结构,如:
typedef struct
{
some members;
}struct_name;
然后它就像为匿名结构提供别名(因为它没有标记名称) . 所以它不能用于前瞻性声明 . 我不知道“前瞻性宣言”是什么意思 .
另外,我想知道以下代码:
typedef struct NAME
{
some members;
}struct_alias;
NAME
和 struct_alias
之间有什么区别吗?或者两者都相等,因为struct_alias是struct NAME的别名?
此外,我们可以声明类似 struct NAME
的变量,如下所示:
struct_alias variable1;
和/或喜欢:
struct NAME variable2;
或者喜欢:
NAME variable3;
5 回答
当需要循环结构声明时,
struct
前向声明可能很有用 . 例:当声明
struct a
时,它还不知道struct b
的规格,但您可以转发它 .当你输入一个匿名结构时,编译器将不允许你在typedef之前使用它的名字 .
This is illegal:
This though is legal:
So is this:
And this:
前向声明是一种承诺,用于定义在无法定义的位置对编译器进行的操作 . 编译器可以使用您的单词来解释否则无法解释的其他声明 .
一个常见的例子是
struct
被设计成链接列表中的一个节点:你需要将一个节点的指针放入struct
,但是如果没有前向声明或标记,编译器就不允许你这样做:我认为作者的观点是,给你的
struct
标签相当于一个前瞻声明:前向声明是实际定义之前的声明,通常用于在定义不可用时能够引用声明的类型 . 当然,并非所有事情都可以通过声明未定义的结构来完成,但在某些情况下可以使用它 . 这种类型称为不完整,并且对其使用有许多限制 . 例如:
这可能是有用的,例如打破循环依赖关系或减少编译时间,因为定义通常要大得多,因此需要更多资源来解析它 .
在您的示例中,
struct NAME
和struct_alias
确实等效 .是正确的;
不是,因为在C中需要
struct
关键字 .struct_alias
和struct NAME
相同,struct_alias
是struct NAME
的别名这些都是相同的并且允许
这是非法的
在Forward declaration上查看此文章
正如其他人之前所说的那样,C / C中的前向声明是对实际定义不可用的声明 . 它是一个声明,告诉编译器“有一个数据类型ABC” .
让我们假装这是一个键/值存储
my_dict.h
的 Headers :您对
my_dict_t
一无所知,但实际上,对于使用您不需要知道的商店:原因是:您只使用POINTERS来处理数据结构 .
POINTERS只是数字,为了处理它们你不需要知道它们指向的是什么 .
只有当你试图实际访问它们时才会这样
因此,要实现这些功能,需要
my_struct_t
的实际定义 . 您可以在源文件my_dict.c
中执行此操作,如下所示:这对于几种情况很方便,比如
用于解决循环类型依赖性,如Sergei L.解释的那样 .
用于封装,如上例所示 .
所以剩下的问题是:为什么我们在使用上述函数时根本不能省略前向声明?最后,编译器知道所有
dict
都是指针就足够了 .但是,编译器会执行类型检查:它需要验证您不执行类似操作
它不需要知道
my_dict_t
的样子,但它需要知道&i
不是get_value()
期望的指针类型 .