c++ - 不同标头中使用的设置结构
问题描述
我正在努力正确设置一些我希望能够跨多个文件使用的结构。我想为我的微控制器保存一些设置,这些设置可以在某些结构中进行操作。主结构包含一些主要设置和具有更具体设置的结构。
我有一个settings.h
、一个a.h
和一个b.h
。在 中settings.h
,我的结构如下:
#ifndef LT_SETTINGS_H
#define LT_SETTINGS_H
#include "SD_save.h"
struct ASettings {
IPAddress ip;
uint16_t port;
char *user;
char *password;
};
struct BSettings {
bool xEnabled;
bool yEnabled;
bool zEnabled;
};
struct Settings {
char *name;
ASettings a;
BSettings b;
bool active;
bool changed = false;
} settings;
[...]
#endif //LT_SETTINGS_H
在settings.cpp
中,我想要从 SD 卡保存和加载这些设置的方法。在a.h
中,我有与A相关的方法,需要来自ASettings
. 类似的东西适用于b.h
和BSettings
. 我希望能够同时操纵ASettings
ina.h
和BSettings
in b.h
。
我该如何做到这一点?我玩过extern
s,typedef
s,不同的设置在各自的头文件中,但我无法编译它。
如果这是一个愚蠢的想法,并且有更好的解决方案,请告诉我。我有一种感觉,我一开始就错误地处理了这个问题。
编辑1:
到目前为止,我只包含了and并且我遇到了很多settings.h
错误:a.h
b.h
multiple definition
libraries/l/a.cpp.o:(.bss.aSettings+0x0): multiple definition of `aSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.aSettings+0x0): first defined here
libraries/l/a.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/a.cpp.o:(.bss.bSettings+0x0): multiple definition of `bSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.bSettings+0x0): first defined here
libraries/l/sensors.cpp.o:(.bss.bSettings+0x0): multiple definition of `bSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.bSettings+0x0): first defined here
libraries/l/sensors.cpp.o:(.bss.aSettings+0x0): multiple definition of `mqttSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.aSettings+0x0): first defined here
libraries/l/sensors.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/settings.cpp.o:(.bss.aSettings+0x0): multiple definition of `aSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.aSettings+0x0): first defined here
libraries/l/settings.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/settings.cpp.o:(.bss.bSettings+0x0): multiple definition of `sensorSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.bSettings+0x0): first defined here
libraries/l/webconf.cpp.o:(.bss.aSettings+0x0): multiple definition of `mqttSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.aSettings+0x0): first defined here
libraries/l/webconf.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/webconf.cpp.o:(.bss.bSettings+0x0): multiple definition of `bSettings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.bSettings+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
(我也b.h
包含在webconf.h
)
编辑2:
我稍微更改了初始代码,将编译器错误减少到:
libraries/l/a.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/sensors.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/settings.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
libraries/l/webconf.cpp.o:(.bss.settings+0x0): multiple definition of `settings'
sketch/sensor_ap_test.ino.cpp.o:(.bss.settings+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
a.h
:
#ifndef LT_MQTT_H
#define LT_MQTT_H
#include "wm_params.h"
#include "settings.h"
#endif //LT_MQTT_H
b.h
:
#ifndef LT_SENSORS_H
#define LT_SENSORS_H
#include "wm_params.h"
#include "settings.h"
[...]
#endif // LT_SENSORS_H
wm_params.h
:
#ifndef LT_WM_PARAMS_H
#define LT_WM_PARAMS_H
[...]
#endif // LT_WM_PARAMS_H
解决方案
该变量setting
被多次定义,因为头文件settings.h
包含在多个 cpp 文件中。一个变量应该只在一个 cpp 文件中定义。要在头文件中声明变量,可以使用extern
关键字。
struct Settings {
char *name;
ASettings a;
BSettings b;
bool active;
bool changed = false;
};
extern Settings settings;
推荐阅读
- flutter - Flutter 共享首选项——未处理的异常:空值检查运算符用于空值
- android - 我正在使用低端笔记本电脑来学习使用 web 和 android 设备的颤振。有什么方法可以加快构建过程吗?
- android - 单击其他项目时更新适配器中的项目
- slack - 如果我们不在 slack api 中启用“交互和快捷方式”选项会发生什么?
- .net - 如何让 VS for Mac 识别我安装了 .NET Core 5.06 SDK?我可能安装了错误的二进制文件
- matlab - 将 Bullet Physics 库连接到 MATLAB
- python - 熊猫过滤器分组
- java - Java 反应器单声道
.zipWith(Mono<>) 应该返回 Mono - java - AEM 服务器在本地运行,但 localhost 拒绝连接
- internet-explorer - 在 IE11 上发送密钥后量角器文件上传挂起。适用于 Chrome/Firefox