c - 将 header 中的结构声明为 typedef
问题描述
我正在尝试将结构定义为头文件中的 typedef 并在许多来源中使用它。我在这里找到了类似的答案,但我不确定是否可以将 typedef 定义为 extern。也msg_encoded
应该有一个默认值。
// lib.h
#ifndef lib_h
#define lib_h
struct msg_encoded_s
{
uint8_t msg[10];
int length;
} msg_encoded_default = {{0}, 0};
typedef struct msg_encoded_s msg_encoded;
#endif
// lib.c
#include "lib.h"
msg_encoded some_var;
// main.c
# include "lib.h"
int main(){
msg_encoded some_other_var;
}
main.o:(.bss.msg_encoded_default+0x0): `msg_encoded_default' 的多重定义
解决方案
像这样的“声明”
struct msg_encoded_s {
...
} msg_encoded_default;
实际上是 (1) 一个struct
名为 -type的定义msg_encoded_s
和 (2)一个名为 `msg_encoded_default 的类型的变量的定义。
因此,如果您将此头文件包含在单独的翻译单元中,那么您将重新定义一个名为 的变量msg_encoded_default
,这是不允许的。
为了克服这个问题,写一个像......
typedef struct msg_encoded_s
{
uint8_t msg[10];
int length;
} msg_encoded;
extern msg_encoded msg_encoded_default;
在一个翻译单元中写道:
#include "myheader.h"
msg_encoded msg_encoded_default = {{0}, 0};
在所有其他翻译单元中,只需写...
#include "myheader.h"
...
int test = msg_encoded_default.length; // or something like this
推荐阅读
- python - 在 keras 张量中复制一列
- use-case - 实体与用例说明
- javascript - Jquery UI Datepicker - 依赖日期选择器排除 Maxdate 中的假期
- excel - 设置范围时 VBA 运行时错误 1004
- ansible - Ansible group_vars 引用和加载另一个 var 文件
- java - 在android的适配器中处理数据库中的值
- docker - 无法从谷歌云构建访问 pip 主机
- android - Flutter App 构建发布问题(Firestore)
- sapply - 在 sapply 中访问向量的先前值
- ios - 应用因隐私而被应用商店拒绝 - 数据收集和存储