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

时间:2018-03-31 10:09:38

标签: c++ arduino arduino-esp8266

我在Arduino IDE中为MEGA2560和ESP8266使用相同的程序。编译和上传代码到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);

1 个答案:

答案 0 :(得分:0)

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

编译Arduino但不编译ESP的原因是因为在Arduino的情况下,编译器默认启用-fpermissive标志(忽略这种错误), ESP编译器不在哪里。这是一个Arduino缺陷,显然是一些非常古老的库,用这个标志编译,现在他们不想删除它,因为害怕破坏旧代码。你永远不应该需要这个标志,它只是为了传统目的,但今天我们知道的更好。