考虑以下结构在ModuleA中定义的:
typedef struct{
int A;
int B;
int C[4];
}myStructType;
myStructType MyStruct;如果我想使用ModuleB中的这个结构,那么会在ModuleA头中声明结构,如下所示:
extern myStructType MyStruct;到现在为止还好。其他模块可以通过包含模块A头文件来读写MyStruct。
现在的问题是:
如何在模块A头文件中只声明结构的一部分?例如,如果我希望ModuleB能够读写MyStruct.C (或者,使事情变得更简单,可能是MyStruct.A或MyStruct.B),但不一定知道它在结构中或知道元素A和B。
编辑:我可能还应该指定,这将在一个嵌入式系统中进行,它基本上在编译时完成所有的内存分配,所以在编译时我们可以非常自信地知道MyStruct的位置(而且它不会移动)。
Edit2:我还将澄清,我并不一定要阻止其他模块访问结构的各个部分,而是允许其他模块访问单个元素,而不必执行MyStruct.Whatever,因为其他模块可能只关心单个元素,而不关心整个结构。
发布于 2012-10-08 14:32:18
您必须封装它,即创建一个私有变量,例如:
static myStructType the_struct;在某些C文件中,然后提供一个API以获得对以下部分的访问:
int * getC(void)
{
return the_struct.C;
}这将允许其他C文件通过调用
int *some_c = getC();
some_c[0] = 4711;或者别的什么。通过更明确地说明返回数组的长度,可以使其“更紧密”--当然,我的目标是最小的解决方案。
发布于 2012-10-08 14:53:38
虽然理论上这个解决方案的整洁性可能存在一些问题(例如,结构对齐),但在实践中,如果它编译,如果它不编译,您可以修改结构使其编译:
#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的保留部分的大小,可能是通过尝试和错误。
你明白了吧。
发布于 2012-10-08 14:23:43
长话短说,- you做不到。为了让它更长一点,你无法可靠地做到。
https://stackoverflow.com/questions/12783669
复制相似问题