声明一个在结构中定义的变量

考虑ModuleA中定义的以下结构:

typedef struct{
    int A;
    int B;
    int C[4];
}myStructType;

myStructType MyStruct;

如果我想从ModuleB使用这个结构体,那么我会在ModuleA头文件中声明这样的结构体:

extern myStructType MyStruct;

到现在为止还挺好。 其他模块可以通过包含Module A头文件来读写MyStruct。

现在的问题是:

我怎样才能在Module A头文件中声明结构的一部分? 例如,如果我希望ModuleB能够读取和写入MyStruct.C(或者为了使事情变得更简单,可能是MyStruct.A或MyStruct.B),但不一定知道它在结构中或知道元素A和B.

编辑:我也许应该指定,这将在嵌入式系统中进行,它在编译时基本上完成所有内存分配,因此我们可以在编译时非常自信地知道MyStruct所在的位置(并且它不会移动周围)。

编辑2:我也会澄清,我不一定要阻止其他模块访问结构的部分,但是,我试图让其他模块访问单个元素而不必执行MyStruct.Whatever,因为其他模块可能只关心单个元素而不关注整个结构。


你将不得不封装它,即做一个私有变量,如:

static myStructType the_struct;

在一些C文件中,然后提供一个API来访问这些部分:

int * getC(void)
{
  return the_struct.C;
}

这会让其他C文件通过调用访问整数数组

int *some_c = getC();
some_c[0] = 4711;

管他呢。 它可以通过更清楚地了解返回数组的长度而变得更“紧密”,我的目标是达到最小的解决方案。


虽然从理论上讲,这种解决方案的清洁可能存在一些问题(例如结构对齐),但实际上它通常在编译时起作用,如果它不编译,则可以改变结构以使其编译:

#include <stddef.h>

#define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]

// You keep this definition private to module A (e.g. in a .c file):
typedef struct
{
    int A;
    int B;
    int C[4];
} PrivateStruct;

// You expose this definition to all modules (in an .h file):
typedef struct
{
    char reserved[2*sizeof(int)];
    int C[4];
} PublicStruct;

// You put these in module A (in a .c file):
C_ASSERT(sizeof(PrivateStruct) == sizeof(PublicStruct));
C_ASSERT(offsetof(PrivateStruct,C) == offsetof(PublicStruct,C));

int main(void)
{
  return 0;
}

在公共.h文件中,您可以向全世界讲述全局变量类型:

extern PublicStruct MyStruct; // It's "PrivateStruct MyStruct;" in module A

如果两个结构定义不同步,则会出现编译时错误(匹配,不匹配)。

您需要手动定义PublicStruct的保留部分的PublicStruct ,或许需要反复试验。

你明白了。


长话短说 - 你不能。 为了使它更长一点,你不能可靠地做到这一点。

链接地址: http://www.djcxy.com/p/73585.html

上一篇: Declare a variable that is Defined in a struct

下一篇: Is the sizeof(enum) == sizeof(int), always?