我的设计包括两层,它们彼此共享一些数据。
下层将一些数据保存在一个结构中:
struct Abc {
int a;
int b;
int c;
};
我需要将结构的b
字段导出Abc
到上层而不访问其余字段。我想在上层创建一个新变量(实际上是别名),它与b
字段位于相同的内存位置。这样两层共享相同的变量。
知道如何在不暴露结构的情况下做到这一点吗?
我不确定您在这里所说的层到底是什么意思,但我假设您需要访问 a 的成员之一,该成员对struct
一个文件是私有的。
在这种情况下,您可以简单地编写一个extern
“peek”函数来返回您想要公开给模块的其他文件的特定结构变量的值。这将保护结构其余部分的范围,同时使该元素的值可访问。
最简单的方法是:
struct Public
{
int a;
};
struct Private
{
struct Public p;
int b;
int c;
};
并且依赖于 C 特性,指向结构的指针可以转换为该结构的第一个成员的类型,反之亦然。
如果结构只包含一个成员,也许你可以不使用Public
它,但最好是未来的证明,你永远不知道什么时候需要更多的公共字段。
这种访问控制可以直接在 C++ 中实现。这在 C 中是不可行的。您必须使用不访问您不应该访问的成员的纪律。
有一个部分替代方案:您可以将私有结构变成一个不透明的指针,并拥有一个知道如何获取b
数据的函数。然后上层代码不需要看到下层数据结构的任何内部结构。
#include "lower.h"
struct Upper
{
int p;
struct Lower *q;
int r;
};
struct Lower *lower_new(void);
void lower_free(struct Lower *);
int lower_b(struct Lower *q);
b
在上层结构的实例中需要来自下层结构的字段的代码u
将编写:
struct Upper u = { ... };
int x = lower_b(u.q);
有很多方法可以将该方案融入到适合您的方案中。请注意,底层结构的公共标头根本没有定义结构的内容;那是隐藏在源代码中的实现细节——大概是<code>lower.c。