Arduino esp32偏好设置的编译时类型转换问题.h

问题描述 投票:0回答:1

我正在尝试使用

preferences.h
读取 SSID,但出现编译时错误,这对我来说似乎没有意义。

根据 Arduino 文档,preferences.getString() 可以返回

char*
String
,但我收到类型转换错误。

error: cannot convert 'String' to 'const char*' in assignment
  533 |   ssid = netPrefs.getString("ssid","");
      |          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
      |                            |
      |                            String

exit status 1

Compilation error: cannot convert 'String' to 'const char*' in assignment

netPrefs
ssid
在全局范围内(即在
setup()
之前)声明如下:

const char* ssid = "myssid";
Preferences netPrefs;

并在

setup()
中,我创建了首选项存储,如下所示:

netPrefs.begin("network-info", false);

导致问题的行很简单:

void readPrefs() {
  ssid = netPrefs.getString("ssid","");
}

setup()
调用。

我想我一定错过了什么。

arduino esp32 arduino-ide arduino-esp32
1个回答
0
投票

netPrefs.getString()
返回类型为
String
的临时对象。您试图将其分配给 C 字符串,即指针
char
。不存在类型转换来使这成为可能。

您可能会想调用

ssid = netPrefs.getString("ssid").c_str();
,但这会产生内存分配错误。由于
getString()
返回的对象是临时的,因此您将收到一个指向临时分配的内存缓冲区的指针。该缓冲区在该行执行完成后立即释放,并且
ssid
现在指向堆中随机未使用的地址,该地址稍后可能会被覆盖。

如果你真的想将

ssid
存储为 C 字符串,那么你必须分配内存来存储该值,然后手动将值从
netPrefs.getString("ssid").c_str()
复制到它。例如:

char ssid[128];
strncpy(ssid, sizeof(ssid), netPrefs.getString("ssid").c_str());

一个更简单的解决方案是创建

ssid
类型的
String
,它会自动管理其内存并在分配时复制新值。如果您以后需要 C 字符串,只需致电
c_str()

String ssid;
ssid = netPrefs.getString("ssid");
...
some_c_api_call(ssid.c_str());
© www.soinside.com 2019 - 2024. All rights reserved.