这取自对SO的不同问题的答案:
结构定义对源文件是私有的,除非放在 共享头文件。没有其他源文件可以访问该成员 struct,即使给出了一个指向struct的指针(因为布局不是 在其他编译单元中已知。)
如果结构需要在别处使用,它必须仅用作a 指针。放置struct structname形式的前向声明; typedef struct structname structname;在headerfile中,并使用 structname *代码库中的其他地方。然后,自从 结构成员只出现在一个源文件中,即结构 内容实际上是对该文件的“私密”。
这让我很困惑。为什么你只能使用指向结构的指针,即使你包含一个声明它的头文件(但没有定义它)?
我的意思是,如果我包含一个声明一个函数的头,一个在单独的实现文件中定义的函数,我仍然可以访问该函数 - 为什么结构不同?即使你能得到宣言,为什么他们的成员是私人的呢?
答案 0 :(得分:3)
它与visibilty无关。引用是指struct 转发声明(因此,没有可用的定义)
标题实际上包含以下内容:
struct X; // No definition available
前向声明引入了不完整类型。对于不完整的类型,你可以做很少的事情,但其中一个是声明一个指针(而不是取消引用它)。
只要编译器不知道结构的大小,或者它的成员(当然不能用简单的前向声明),它就不允许X
的任何声明,也不任何解除指向X
的指针。