声明一个在结构中定义的变量
考虑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