2

我想问一下 C 中的前向声明。它们通常如何工作。例如,如果在文件中我声明

struct task_struct;

并在其他文件中定义结构会起作用吗?因为据我所知编译器必须知道正在声明的变量的大小。如果确实如此,那么编译器实际上如何处理这种类型的请求?

我在 Linux 源代码中找到了上面的示例,这让我很感兴趣。

4

2 回答 2

5

使用前向声明后,该类型将变为编译器的不完整类型
编译器对类型的大小或布局一无所知,因此您无法执行任何需要编译器知道这些的操作。

在 C 中,如果前向声明一个类型,则只能使用指向该类型的指针。由于指向所有结构类型的指针需要相同的大小[Note],编译器很高兴知道它有一个指向类型的指针。

如果我转发声明一个结构并在其他文件中定义它,它会起作用吗?

只要您只使用指向前向声明结构的文件中的结构的指针,它就可以了。如果你取消引用指针,你会得到错误,因为编译器不知道 Incomplete 类型的布局。


[注意]感谢 melpomene 和 Daniel 的澄清。

于 2013-01-12T16:10:40.090 回答
0

“工作”是什么意思?无论哪种方式,它都会以自己的方式工作。

在结构类型的完整声明不可见的地方,它是一个不完整的类型,只能用作不完整的类型。

在结构类型的完整声明可见的地方,它变成了一个完整的类型,并且可以用作完整的类型。

这里的所有都是它的。

与完整结构类型相比,不完整结构类型的可用性显着降低。基本上,您只能声明指向此类类型的指针并传递它们。其他任何事情(例如声明该类型的对象)都需要完整声明。

于 2013-01-12T16:46:21.580 回答