Try   HackMD
tags: 雜~~瓦魯多~~筆記

編譯器訊息與警告

如果程式出了語法bug,在編譯時就會被編譯器抓出來了。
不過該如何看懂編譯器給的提示呢?

Dev-c++ 的編譯器訊息

在程式編寫完成,按下F11編譯之後,如果有bug,編譯器就會跳出錯誤訊息,以及bug所在的行數,如下圖:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

右邊的 [Error] 'ssdr' was not declared in this scope 就是錯誤訊息。
最左邊的 6 則是錯誤出現在第 6 行,行數是按照每一行旁邊的編號顯示的。

透過這些錯誤訊息,我們能更快的找出程式的 bug 出現在哪,以及 bug 的類型,方便我們進行後續的 debug (除錯)。

常見錯誤訊息

忘記加分號

若是執行以下程式碼:

#include<iostream> using namespace std; int main(){ int ex=25 //少一個分號 char ch; cout<<ex; return 0; }

Line 6: [Error] expected ',' or ';' before 'char'

翻譯: 在 'char' 之前應該要有 ',' 或是 ';'

在 Line 6 的 char 之前,也就是 Line 5 的尾端,少了一個分號,才會跳出這個訊息。

解決方法:在 Line 5 尾端補上一個 ;

變數未宣告或是名稱打錯

若是執行以下程式碼:

#include<iostream> using namespace std; int main(){ int VAR; var=25; //變數名稱打成小寫的 var cout<<var; return 0; }

Line 6: [Error] 'var' was not declared in this scope

翻譯: 'var' 在此區域中未被宣告

這是因為 Line 5 宣告的變數是 VAR ,但 Line 6 使用的變數 var 還沒被宣告過(名稱大小寫不同,會視為不同變數)。

解決方法:宣告變數 var
可以將 Line 5 的變數名稱改為 var ,或是另外宣告一個變數叫做 var

重複宣告兩個相同的變數

#include<iostream> using namespace std; int main(){ int var=25; int var; cout<<var; return 0; }

Line 6: [Error] redeclaration of 'int var'
Line 5: [Note] 'int var' previously declared here

翻譯:'int var' 重複宣告註:'int var' 在這裡宣告過了

Line 5 中已宣告過 int var,所以在 Line 6 再宣告一次就會造成錯誤。

解決方法:把 Line 6 或 Line 5 的 var 名字改掉。

cin的>>、cout的<<打錯邊

#include<iostream> using namespace std; int main(){ int var=25; cout>>var; return 0; }

Line 6: [Error] no match for 'operator>>' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'int')

翻譯:不與 'operator>>' (運算子 '>>')相匹配...(下略)

這種狀況通常是因為把大小於方向打反,導致編譯器找不到與該運算子匹配的元素。

解決方法:把寫錯的符號改掉即可。

大括號少一邊

#include<iostream> using namespace std; int main(){ int var=25; if(var==25){ cout<<"Yes"; } else{ cout<<"No"; //少了else後面的大括號 return 0; }

Line 14: [Error] expected '}' at end of input

翻譯: 輸入的末端應該要有 '}'

由於大括號的功能是劃分區塊用,一個大括號頭就應該要配對一個大括號尾,不然會發生區塊劃分不完全的問題。

這個錯誤訊息的行數是無法參考的,因為它只會指出最後一個大括號尾的行數,因此需要自己檢查每個括號的配對。

解決方式:一個一個括號頭與括號尾配對檢查,看是哪一個括號沒配對好。
不過我個人有時是習慣直接重寫

未引入需要的標頭檔

#include<iostream> using namespace std; int main(){ int var=25; cout<<pow(var,2); return 0; }

Line 6: [Error] 'pow' was not declared in this scope

翻譯:'pow' 在此區域中未被宣告

這題所使用的pow,功能是取a的b次方,但要使用這個函式,必須引入 <cmath> 函式庫。

解決方式:在程式最上面,加上一行 #include<cmath> ,以引入 cmath> 函式庫。

按下F11之後程式未執行

[Error] ld returned 1 exit status

翻譯:連接器ld回傳狀態碼1

如果按下 F11 之後,程式無法順利運行,那可能是因為已經有一個正在執行的此程式了,需要先把其中一個視窗關掉才能再執行。

解決方式:關掉上一次運行程式的終端視窗,然後再試一次。

小結

這裡只列出了幾個編者本人有想到的、當初還在新手期時常常犯的小錯誤,不知道這些能否幫助各位解題更順利?

當初本人也是學了好一段時間才知道有編譯器訊息這東西的,因為這實在是個很方便的功能,免去在茫茫程式海中找分號的痛苦,所以希望各位也能好好利用這個功能,來找出自己錯的地方。

只要了解編譯器訊息,對於 debug 將會有顯著的幫助。

而如果之後遇到了這篇裡沒提到的編譯器訊息,也可以直接把錯誤訊息複製到 google 上去搜尋,通常都會有人遇到一樣的問題,也會提供一些可行的解法。

不過在搜尋之前,建議自己先從字面意思,去推測看看自己錯在哪,順便練習下英文吧