结构在其他文件的可见性方面如何表现?

这是从对SO的不同问题的答案中得出的:

除非放在共享头文件中,否则结构定义对源文件是私有的。 没有其他源文件可以访问结构的成员,即使给定了指向结构的指针(因为在其他编译单元中不知道布局)。

如果结构需要在别处使用,则它必须仅用作指针。 放置struct structnameforms的前向声明; typedef struct structname structname; 在头文件中,并在代码库中的其他地方使用structname *。 然后,由于结构成员仅出现在一个源文件中,因此结构的内容实际上是对该文件的“私有”。

这让我很困惑。 为什么你只能使用指向结构的指针,即使你包含一个声明它的头文件(但没有定义它)?

我的意思是,如果我包含一个声明函数的头,一个在单独的实现文件中定义的函数,我仍然可以访问该函数 – 为什么结构不同? 即使您可以获得声明,为什么他们的成员是私人的?

它与visibilty无关。 引用是指结构转发声明 (因此,没有可用的定义)

标题实际上包含以下内容:

 struct X; // No definition available 

前向声明引入了不完整的类型 。 对于不完整的类型,您可以做很少的事情,但其中一个是声明指针(不解除引用)。

只要编译器不知道结构的大小,或者它的成员(它当然不能使用简单的前向声明),它就不允许任何X声明,也不会解释指向的结构。 X