不同标题中使用的设置结构

问题描述

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

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

我该如何完成?我玩过externtypedef s,不同的设置位于相应的头文件中,但是我无法编译它。

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


编辑1:

到目前为止,我仅包括settings.ha.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

({{1}中也包含b.h


编辑2:

我对初始代码进行了一些更改,将编译器错误减少至此:

webconf.h

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

解决方法

由于多个cpp文件包含头文件setting,因此多次定义了变量settings.h。 只能在一个cpp文件中定义一个变量。要在头文件中声明变量,可以使用extern关键字。

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

  bool changed = false;
};
extern Settings settings;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...