我想询问C中的前向声明。它们的工作原理如何。 例如,如果在文件中我声明
struct task_struct;
并在其他文件中定义struct它会起作用吗?因为据我所知,编译器必须知道正在声明的变量的大小。如果是,那么编译器如何实际处理这种类型的请求?
我在Linux源代码中找到了上面的例子让我感兴趣。
答案 0 :(得分:5)
使用转发声明后,类型将变为编译器的 不完整类型 。
编译器对类型的大小或布局一无所知,因此您无法执行任何需要编译器知道这些操作的操作。
在C中,如果转发声明类型,则只能使用指向该类型的指针。由于指向所有结构类型的指针需要相同的大小 [Note] ,编译器很高兴知道它有一个指向类型的指针。
如果我转发声明一个结构并定义它的其他文件会起作用吗?
只要您只使用指向文件结构的指针,该结构将向前声明结构。如果取消引用指针,则会出现错误,因为编译器不知道不完整类型的布局。
[注意] 感谢melpomene&丹尼尔澄清了这一点。
答案 1 :(得分:0)
“工作”是什么意思?无论哪种方式,它都会以自己的方式运作。
在结构类型的完整声明不可见的地方,它是一个不完整的类型,仅可用作不完整类型。
在结构类型的完整声明可见的位置,它变为完整类型,可用作完整类型。
这就是它的全部。
与完整结构类型相比,不完整结构类型的可用性显着降低。基本上,您只能声明指向这些类型的指针并传递它们。其他任何事情(如声明该类型的对象)都需要完整的声明。