前言
使用 VS Code + PIO 之後,將舊的程式或一些範例程式複製到 main.cpp 之後,
遇到的第一個問題就是編譯失敗。 出現如下 was not declared in this scope 錯誤
src\main.cpp:行數:位置: error: '函數名稱' was not declared in this scope
但是如果把 void dly100() 這個函數放到呼叫之前就正常了,這是因為 C++的標準,使用前都要先做【宣告】
解決方法可以
- loop()擺到 dly100() 之後
- dly100() 擺到 loop() 之前
- 在 loop()之前增加 void dly100(); 宣告
- 將附檔名改成 ino
為何會有此差異,大家可以先試著先採用 4 的方式進行編譯,並注意觀察 src 目錄的變化,
會發現該目錄編譯過程會產生一個 main.ino.cpp ,但是編譯完成後就會被刪除,
大家可以試著編譯過程將該檔案給複製出來查看內榮,會發現 ino 會被先經過一層處理產生 cpp 之後再進行編譯
而該 cpp 與 ino 的差異就在於多了上述解決方案 3 的宣告。
所以遇到該問題最簡單的方式 就是將 cpp 改成 ino ,就可以簡單解決該問題。
若想更了解 ino 與 cpp 之差異
參考以下文章
http://www.visualmicro.com/page/User-Guide.aspx?doc=INOs-and-CPPs.html
簡單來說就是..
- 如果你專案下有多個 ino 檔,會自動先被整理成一個 cpp 檔,然後在進行編譯
- 如果有多個 .cpp 那請你學其他 .cpp 先做一個 .h 並加上一些定義
#ifndef dly3_h #define dly3_h #ifdef __cplusplus extern "C" { #endif #include <Arduino.h> void dly3(); #ifdef __cplusplus } // extern "C" #endif
- 請不要同時使用 main.cpp 及 main.ino ,沒意義只是讓自己容易造成混亂而已。
PIO 主專案 ino 檔名請務必使用 main ,必須包含 setup() loop() 兩個函式
編譯過程產生 main.ino.cpp 如下圖
dly2() 是 dly.ino 裡面的函數 ,被納進來 main.ino.cpp了。
留言列表