0

我的设计包括两层,它们彼此共享一些数据。

下层将一些数据保存在一个结构中:

struct Abc {
    int a;
    int b;
    int c;
};

我需要将结构的b字段导出Abc到上层而不访问其余字段。我想在上层创建一个新变量(实际上是别名),它与b字段位于相同的内存位置。这样两层共享相同的变量。

知道如何在不暴露结构的情况下做到这一点吗?

4

3 回答 3

0

我不确定您在这里所说的层到底是什么意思,但我假设您需要访问 a 的成员之一,该成员对struct一个文件是私有的。

在这种情况下,您可以简单地编写一个extern“peek”函数来返回您想要公开给模块的其他文件的特定结构变量的值。这将保护结构其余部分的范围,同时使该元素的值可访问。

于 2012-09-07T06:51:10.897 回答
0

最简单的方法是:

struct Public
{
    int a;
};

struct Private
{
    struct Public p;
    int b;
    int c;
};

并且依赖于 C 特性,指向结构的指针可以转换为该结构的第一个成员的类型,反之亦然。

如果结构只包含一个成员,也许你可以不使用Public它,但最好是未来的证明,你永远不知道什么时候需要更多的公共字段。

于 2012-09-07T06:43:14.353 回答
0

这种访问控制可以直接在 C++ 中实现。这在 C 中是不可行的。您必须使用不访问您不应该访问的成员的纪律。

有一个部分替代方案:您可以将私有结构变成一个不透明的指针,并拥有一个知道如何获取b数据的函数。然后上层代码不需要看到下层数据结构的任何内部结构。

上层.h

#include "lower.h"

struct Upper
{
    int p;
    struct Lower *q;
    int r;
};

较低的.h

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。

于 2012-09-07T06:57:03.747 回答