不同 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.hBSettings 也有类似的情况。 我希望能够同时操纵 a.h 中的 ASettingsb.h 中的 BSettings

我该如何做到这一点?我玩过 externs、typedefs,不同的设置在各自的 header 文件中,但我无法编译它。

如果这是一个愚蠢的想法并且有更好的解决方案,请告诉我。我觉得我一开始就错误地处理了这个问题。


编辑 1:

到目前为止,我只包括 a.hb.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;