簡體   English   中英

為什么Arduino對於Mega 2560和ESP8266的字符指針處理有兩種不同的行為?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM