这是摘自对 SO 上另一个问题的回答:
结构定义对于源文件来说是私有的,除非放置在
共享头文件。没有其他源文件可以访问该成员
struct,即使给定一个指向该结构的指针(因为布局不是
在其他编译单元中已知)。
如果该结构需要在其他地方使用,则必须仅将其用作
指针。放置 struct structname 形式的前向声明;
typedef 结构体 结构体名称 结构体名称;在头文件中,并使用
structname * 代码库中其他任何地方。那么,自从
结构体成员只出现在一个源文件中,该结构体的
内容对于该文件来说实际上是“私有的”。
这让我很困惑。为什么即使包含声明它(但未定义它)的头文件也只能使用指向结构的指针?
我的意思是,如果我包含一个声明函数的标头,该函数是在单独的实现文件中定义的,我仍然可以访问该函数 - 为什么结构不同?即使您可以获得声明,为什么他们的成员也是私有的?
这与可见性无关。引用引用的是一个结构体前向声明(因此,没有可用的定义)
标头实际上包含类似以下内容:
struct X; // No definition available
前向声明引入了不完全型。对于不完整的类型,您可以做的事情很少,但其中之一就是声明一个指针(而不是取消引用它)。
只要编译器不知道结构体的大小或其成员(它当然不能通过简单的前向声明),它就不允许任何声明X
,也不对指向某个指针的任何取消引用X
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)