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

时间:2015-01-13 23:04:55

标签: c pointers struct

这取自对SO的不同问题的答案:

  

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

     

如果结构需要在别处使用,它必须仅用作a   指针。放置struct structname形式的前向声明;   typedef struct structname structname;在headerfile中,并使用   structname *代码库中的其他地方。然后,自从   结构成员只出现在一个源文件中,即结构   内容实际上是对该文件的“私密”。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

struct X;  // No definition available

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

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