【发布时间】:2015-03-12 01:24:02
【问题描述】:
这来自对 SO 上另一个问题的回答:
结构定义对源文件是私有的,除非放在 共享头文件。没有其他源文件可以访问 struct,即使给定了一个指向该结构的指针(因为布局不是 在其他编译单元中已知)。
如果结构需要在其他地方使用,它必须仅用作 指针。提出 struct structname 形式的前向声明; typedef struct structname structname;在头文件中,并使用 structname * 代码库中的其他任何地方。那么,由于 结构成员只出现在一个源文件中,结构的 内容实际上是该文件的“私有”。
这让我很困惑。为什么即使包含声明它的头文件(但没有定义它),也只能使用指向结构的指针?
我的意思是,如果我包含一个声明函数的头文件,一个在单独的实现文件中定义的函数,我仍然可以访问该函数——为什么结构不同?为什么他们的成员是私有的,即使你可以得到声明?
【问题讨论】:
-
如果在结构定义中包含标头,则不仅限于使用指向结构的指针。但是只有结构声明的标头是不寻常的,因为您可以随时说
struct Foo。你不需要一个标题。 -
我的意思是如果你只包含结构声明的标题。
-
很公平。因为指针不需要完整的类型。你只能做不需要完整类型的事情。但正如我所说,具有结构声明但没有定义的标头是不寻常的。
-
你引用的文字写得不太好。请记住,“头文件”仅在预处理之前是分开的;预处理后只有翻译单元。