c - 我可以从 PIC C18 中的 main.c 访问我的 source.c 中的联合吗?
问题描述
我处于一个包含多个元素的匿名结构的位置。为了通过索引访问它们,我将它们放在一个联合中,如下所示:
union
{
struct
{
unsigned char COMMAND; //STRUCT_ARRAY[0]
unsigned char ADDR_H; //STRUCT_ARRAY[1]
unsigned char ADDR_M; //STRUCT_ARRAY[2]
unsigned char ADDR_L; //STRUCT_ARRAY[3]
unsigned char DATA; //STRUCT_ARRAY[4]
unsigned char CHECKSUM; //STRUCT_ARRAY[5]
};
unsigned char STRUCT_ARRAY[6];
//all of the struct members can be accessed from STRUCT_ARRAY by index
}MY_UNION;
此联合当前驻留在文件source.c
中。我需要从main.c
. 我有一个两个文件都包含的标题,我们称之为header.h
。
ADDR_H
例如,如何ADDR_M
在从 source.c 定期修改时读取 main.c 中的值?
代码有点像这样:
来源.c:
#include "header.h"
union
{
struct
{
unsigned char COMMAND; //STRUCT_ARRAY[0]
unsigned char ADDR_H; //STRUCT_ARRAY[1]
unsigned char ADDR_M; //STRUCT_ARRAY[2]
unsigned char ADDR_L; //STRUCT_ARRAY[3]
unsigned char DATA; //STRUCT_ARRAY[4]
unsigned char CHECKSUM; //STRUCT_ARRAY[5]
};
unsigned char STRUCT_ARRAY[6];
//all of the struct members can be accessed from STRUCT_ARRAY by index
}MY_UNION;
void modify(void)
{
MY_UNION.ADDR_H = somevalue;
MY_UNION.ADDR_M = somevalue;
MY_UNION.ADDR_L = somevalue;
}
在 main.c 中:
#include "header.h"
void main(void)
{
modify();
print(MY_UNION.ADDR_H); //custom function to print values to a screen
print(MY_UNION.ADDR_M);
print(MY_UNION.ADDR_L);
}
解决方案
基本程序设计:
- 永远不要在头文件中声明变量。
- 永远不要使用带有
extern
. - 不要在处理协议的翻译单元之外直接公开诸如此协议结构之类的内部结构。您需要在两者之间有一个抽象层。
快速而肮脏的解决方案:
将 h 文件中的 union 定义更改为 typedef:
typedef union { struct { unsigned char COMMAND; //STRUCT_ARRAY[0] unsigned char ADDR_H; //STRUCT_ARRAY[1] unsigned char ADDR_M; //STRUCT_ARRAY[2] unsigned char ADDR_L; //STRUCT_ARRAY[3] unsigned char DATA; //STRUCT_ARRAY[4] unsigned char CHECKSUM; //STRUCT_ARRAY[5] }; unsigned char STRUCT_ARRAY[6]; //all of the struct members can be accessed from STRUCT_ARRAY by index } MY_UNION;
在 .c 文件中本地声明实际变量:
static MY_UNION my_union;
.使用 setter/getter 访问变量,例如:
uint8_t get_address_h (void) { return my_union.ADDR_H; } void set_address_h (uint8_t addr_h) { my_union.ADDR_H = addr_h; }
适当的解决方案:
在一个合适的程序中,你应该完全隐藏这个协议的内部,对其他文件,包括 typedef 联合。
除了协议转换器之外,没有人可以访问这个联合。您将拥有调用者可以在不知道协议内部结构的情况下知道的函数set_address
等。set_data
推荐阅读
- angularjs - 我可以使用 azure ad api 或 adal-anuglar 注销特定用户吗?
- ios - UiCollectionView 辅助功能焦点
- bash - 如何从多个 png 图像创建动画 gif 图像?
- javascript - 如果我将组件作为道具传递,它什么时候被渲染?
- grafana - 仪表板上的 Grafana 钻取链接
- python - 如何将基于 mongodb 的查询转换为基于 python 的 pymongo 脚本?
- sql - 使用光标在表格中选择或插入数据
- c++ - C++ 类指针和所有权
- regex - 如何在标头中查找值
- mysql - 错误代码: 1044: 用户 ' ' '@' '%' 拒绝访问数据库