我的设计包括两层,它们彼此共享一些数据。
下层保存结构中的一些数据:
struct Abc {
int a;
int b;
int c;
};
我需要将b
结构的Abc
字段导出到上层,而无需访问其他字段。
我想在上层创建一个新变量(实际上是一个别名),它位于与b
字段相同的内存位置。这样两个层共享相同的变量。
知道在不暴露结构的情况下如何做到这一点?
答案 0 :(得分:0)
最简单的方法是:
struct Public
{
int a;
};
struct Private
{
struct Public p;
int b;
int c;
};
依赖于C特性,可以将指向结构的指针强制转换为该结构的第一个成员的类型,反之亦然。
如果它只包含一个成员,可能没有Public
结构,但最好是将来证明,并且你永远不知道何时需要更多公共字段。
答案 1 :(得分:0)
我不确定这里的图层究竟是什么意思,但我假设您需要访问struct
的一个成员,该成员对一个文件是私有的。
在这种情况下,您可以简单地编写一个extern
“peek”函数来返回要向模块的其他文件公开的特定结构变量的值。这将保护结构其余部分的范围,同时使一个元素的值可访问。
答案 2 :(得分:0)
这种访问控制可直接在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);
有很多方法可以将这个方案变成适合你的方案。注意,下层结构的公共头文件根本没有定义结构的内容;这是隐藏在源代码中的实现细节 - 大概是lower.c
。