为什么 Arduino 对于 Mega 2560 和 ESP8266 的字符指针处理有两种不同的行为?

Why does Arduino have two different behavior for character pointer processing for Mega 2560 and ESP8266?

我在 Arduino 中为 MEGA2560 和 ESP8266 使用相同的程序 IDE。当编译并上传代码到 Mega 时,一切都很好。但是对于 ESP8266 代码没有编译。

密码是:

...
String s = F("TEl:+12345678912");
scrollText(3, s.c_str(), 1, 20);    
...
void scrollText(byte row,char *p,byte space,int time_delay)
{
 ...
}

错误是:

initializing argument 2 of 'void scrollText(byte, char*, byte,int)' [-fpermissive]

invalid conversion from 'const char*' to 'char*' [-fpermissive]
     scrollText(3, s.c_str(), 1, 20);

问题是 str::c_str() returns 是一个 const char * 类型的变量,但是你的函数 scrollText(...) 需要一个 char * 类型的参数。这是一个缩小转换,通常是一个坏主意(修改指针很容易导致段错误或在最微小的滑动时崩溃)。您可以在编译器中设置一些标志以忽略此转换警告,或将参数类型更改为 const char * 以匹配输入的类型(如果您稍后在函数中尝试这样做,这将导致不同的编译器错误在声明为 const 时更改此参数)。选择你的解决方案,但我可以给你一些建议:永远不要相信指针和 non-consts 除非你真的知道你在做什么。

之所以为 Arduino 而不是为 ESP 编译是因为在 Arduino 的情况下,编译器在默认情况下使用 -fpermissive 标志启动(忽略此类错误), 而 ESP 编译器不是。这是 Arduino 的一个缺陷,显然是一些非常古老的库在编译时启用了这个标志,现在他们不想删除它,因为害怕破坏旧代码。你不应该需要这个标志,它只是为了遗留目的而存在,但今天我们知道得更好。