【问题标题】:How do structs behave in terms of visibility to other files?结构在对其他文件的可见性方面如何表现?
【发布时间】:2015-03-12 01:24:02
【问题描述】:

这来自对 SO 上另一个问题的回答:

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

如果结构需要在其他地方使用,它必须仅用作 指针。提出 struct structname 形式的前向声明; typedef struct structname structname;在头文件中,并使用 structname * 代码库中的其他任何地方。那么,由于 结构成员只出现在一个源文件中,结构的 内容实际上是该文件的“私有”。

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

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

【问题讨论】:

  • 如果在结构定义中包含标头,则不仅限于使用指向结构的指针。但是只有结构声明的标头是不寻常的,因为您可以随时说struct Foo。你不需要一个标题。
  • 我的意思是如果你只包含结构声明的标题。
  • 很公平。因为指针不需要完整的类型。你只能做不需要完整类型的事情。但正如我所说,具有结构声明但没有定义的标头是不寻常的。
  • 你引用的文字写得不太好。请记住,“头文件”仅在预处理之前是分开的;预处理后只有翻译单元。

标签: c pointers struct


【解决方案1】:

它与可见性无关。引用是指结构 前向声明(因此,没有可用的定义)

标题实际上包含类似的内容:

struct X;  // No definition available

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多