结构在其他文件的可见性方面如何表现?
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
.
的指针的取消引用
这摘自对 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
.