【发布时间】:2012-09-07 06:38:09
【问题描述】:
我的设计包括两层,它们彼此共享一些数据。
下层将一些数据保存在一个结构中:
struct Abc {
int a;
int b;
int c;
};
我需要将Abc 结构的b 字段导出到上层,而不能访问其余字段。
我想在上层创建一个新变量(实际上是别名),它与b 字段位于相同的内存位置。这样两层共享相同的变量。
知道如何在不暴露结构的情况下做到这一点吗?
【问题讨论】:
我的设计包括两层,它们彼此共享一些数据。
下层将一些数据保存在一个结构中:
struct Abc {
int a;
int b;
int c;
};
我需要将Abc 结构的b 字段导出到上层,而不能访问其余字段。
我想在上层创建一个新变量(实际上是别名),它与b 字段位于相同的内存位置。这样两层共享相同的变量。
知道如何在不暴露结构的情况下做到这一点吗?
【问题讨论】:
最简单的方法是:
struct Public
{
int a;
};
struct Private
{
struct Public p;
int b;
int c;
};
并且依赖于 C 特性,指向结构的指针可以转换为该结构的第一个成员的类型,反之亦然。
如果Public 结构仅包含一个成员,您可能可以不使用它,但最好是面向未来,您永远不知道何时需要更多公共字段。
【讨论】:
int *my_pointer = &abc.b;, #define myb (*my_pointer)
我不确定您在这里所说的层到底是什么意思,但我假设您需要访问 struct 的成员之一,该成员对一个文件是私有的。
在这种情况下,您可以简单地编写一个extern“peek”函数来返回您想要公开给模块的其他文件的特定结构变量的值。这将保护结构其余部分的范围,同时使该元素的值可访问。
【讨论】:
这种访问控制可以直接在 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);
在上层结构的实例u 中需要下层结构中的b 字段的代码会这样写:
struct Upper u = { ... };
int x = lower_b(u.q);
有很多方法可以将该方案调整为适合您的方案。请注意,底层结构的公共标头根本没有定义结构的内容;那是隐藏在源代码中的一个实现细节——大概是lower.c。
【讨论】: