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