首页 > 解决方案 > 不同标头中使用的设置结构

问题描述

我正在努力正确设置一些我希望能够跨多个文件使用的结构。我想为我的微控制器保存一些设置,这些设置可以在某些结构中进行操作。主结构包含一些主要设置和具有更具体设置的结构。

我有一个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. 我希望能够同时操纵ASettingsina.hBSettingsin b.h

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

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


编辑1:

到目前为止,我只包含了and并且我遇到了很多settings.h错误:a.hb.hmultiple 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

标签: c++structsettings

解决方案


该变量setting被多次定义,因为头文件settings.h包含在多个 cpp 文件中。一个变量应该只在一个 cpp 文件中定义。要在头文件中声明变量,可以使用extern关键字。

struct Settings {
  char *name;
  ASettings a;
  BSettings b;
  bool active;

  bool changed = false;
};
extern Settings settings;

推荐阅读