[英]Why does Arduino have two different behavior for character pointer processing for Mega 2560 and 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);
問題是str::c_str()
返回類型為const char *
的變量,但是您的函數scrollText(...)
期望使用char *
類型的參數。 這是一個縮小的轉換,通常不是一個好主意(修改指針可以很容易地導致您在最微小的錯誤中出現段錯誤或崩潰)。 您可以在編譯器中設置一些標志以忽略此轉換警告,或將參數的類型更改為const char *
以匹配輸入的類型(如果稍后在函數中嘗試對此進行更改,則會導致不同的編譯器錯誤聲明為const時的參數)。 選擇您的解決方案,但是我可以建議您:除非您真正了解自己在做什么,否則請不要相信指針和非const。
之所以針對Arduino而不是ESP進行編譯,是因為在Arduino的情況下,默認情況下-fpermissive
標志處於啟用狀態(忽略此類錯誤)時啟動了編譯器,而ESP編譯器則沒有。 這是Arduino的缺陷,顯然有些非常老的庫在啟用此標志的情況下進行了編譯,現在他們由於擔心破壞舊代碼而不想刪除它。 您永遠不需要此標志,它只是出於遺留目的而存在,但是今天我們知道了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.