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

How do structs behave in terms of visibility to other files?

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

A structure definition is private to a source file unless placed in a shared header file. No other source file can access the members of the struct, even if given a pointer to the struct (since the layout is not known in the other compilation unit).

If the struct needs to be used elsewhere, it must be used only as a pointer. Put a forward declaration of the form struct structname; typedef struct structname structname; in the headerfile, and use structname * everywhere else in your codebase. Then, since the structure members appear only in one source file, the structure's contents are effectively 'private' to that file.

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

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

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

header 实际上包含类似 :

的内容
struct X;  // No definition available

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

只要编译器不知道结构的大小,或者它的成员(它肯定不能用简单的前向声明),它就不允许 X 的任何声明,也没有任何指向 X.

的指针的取消引用