我正在尝试使用
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()
调用。
我想我一定错过了什么。
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());