首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >声明在结构中定义的变量。

问声明在结构中定义的变量。
EN

Stack Overflow用户
提问于 2012-10-08 14:21:22
回答 6查看 178关注 0票数 2

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

代码语言:javascript
复制
typedef struct{
    int A;
    int B;
    int C[4];
}myStructType;

myStructType MyStruct;

如果我想使用ModuleB中的这个结构,那么会在ModuleA头中声明结构,如下所示:

代码语言:javascript
复制
extern myStructType MyStruct;

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

现在的问题是:

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

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

Edit2:我还将澄清,我并不一定要阻止其他模块访问结构的各个部分,而是允许其他模块访问单个元素,而不必执行MyStruct.Whatever,因为其他模块可能只关心单个元素,而不关心整个结构。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-08 14:32:18

您必须封装它,即创建一个私有变量,例如:

代码语言:javascript
复制
static myStructType the_struct;

在某些C文件中,然后提供一个API以获得对以下部分的访问:

代码语言:javascript
复制
int * getC(void)
{
  return the_struct.C;
}

这将允许其他C文件通过调用

代码语言:javascript
复制
int *some_c = getC();
some_c[0] = 4711;

或者别的什么。通过更明确地说明返回数组的长度,可以使其“更紧密”--当然,我的目标是最小的解决方案。

票数 3
EN

Stack Overflow用户

发布于 2012-10-08 14:53:38

虽然理论上这个解决方案的整洁性可能存在一些问题(例如,结构对齐),但在实践中,如果它编译,如果它不编译,您可以修改结构使其编译:

代码语言:javascript
复制
#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文件中,您可以向世界介绍全局变量类型:

代码语言:javascript
复制
extern PublicStruct MyStruct; // It's "PrivateStruct MyStruct;" in module A

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

您将需要手动定义PublicStruct的保留部分的大小,可能是通过尝试和错误。

你明白了吧。

票数 2
EN

Stack Overflow用户

发布于 2012-10-08 14:23:43

长话短说,- you做不到。为了让它更长一点,你无法可靠地做到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12783669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档