为什么 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 的一个缺陷,显然是一些非常古老的库在编译时启用了这个标志,现在他们不想删除它,因为害怕破坏旧代码。你不应该需要这个标志,它只是为了遗留目的而存在,但今天我们知道得更好。
我在 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 的一个缺陷,显然是一些非常古老的库在编译时启用了这个标志,现在他们不想删除它,因为害怕破坏旧代码。你不应该需要这个标志,它只是为了遗留目的而存在,但今天我们知道得更好。