不同 headers 中使用的设置结构
Settings structs used in different headers
我正在努力正确设置一些我希望能够跨多个文件使用的结构。我想为我的微控制器保存一些可以在某些结构中操作的设置。主结构包含一些主要设置和具有更具体设置的结构。
我有一个 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
也有类似的情况。
我希望能够同时操纵 a.h
中的 ASettings
和 b.h
中的 BSettings
。
我该如何做到这一点?我玩过 extern
s、typedef
s,不同的设置在各自的 header 文件中,但我无法编译它。
如果这是一个愚蠢的想法并且有更好的解决方案,请告诉我。我觉得我一开始就错误地处理了这个问题。
编辑 1:
到目前为止,我只包括 a.h
和 b.h
中的 settings.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
(我在webconf.h
中也有b.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
由于头文件settings.h
被多个cpp文件包含,变量setting
被定义了多次。
一个变量应该只在一个 cpp 文件中定义。要在头文件中声明变量,可以使用 extern
关键字。
struct Settings {
char *name;
ASettings a;
BSettings b;
bool active;
bool changed = false;
};
extern Settings settings;
我正在努力正确设置一些我希望能够跨多个文件使用的结构。我想为我的微控制器保存一些可以在某些结构中操作的设置。主结构包含一些主要设置和具有更具体设置的结构。
我有一个 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
也有类似的情况。
我希望能够同时操纵 a.h
中的 ASettings
和 b.h
中的 BSettings
。
我该如何做到这一点?我玩过 extern
s、typedef
s,不同的设置在各自的 header 文件中,但我无法编译它。
如果这是一个愚蠢的想法并且有更好的解决方案,请告诉我。我觉得我一开始就错误地处理了这个问题。
编辑 1:
到目前为止,我只包括 a.h
和 b.h
中的 settings.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
(我在webconf.h
中也有b.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
由于头文件settings.h
被多个cpp文件包含,变量setting
被定义了多次。
一个变量应该只在一个 cpp 文件中定义。要在头文件中声明变量,可以使用 extern
关键字。
struct Settings {
char *name;
ASettings a;
BSettings b;
bool active;
bool changed = false;
};
extern Settings settings;