C中的结构字段别名

时间:2012-09-07 06:38:09

标签: c structure aliasing

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

下层保存结构中的一些数据:

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

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

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

3 个答案:

答案 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数据的函数。然后上层代码不需要看到下层数据结构内部的任何内容。

upper.h

#include "lower.h"

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

lower.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);

有很多方法可以将这个方案变成适合你的方案。注意,下层结构的公共头文件根本没有定义结构的内容;这是隐藏在源代码中的实现细节 - 大概是lower.c