<style> html, body, .ui-content { background-color: #333; color: #ddd; } body > .ui-infobar { display: none; } .ui-view-area > .ui-infobar { display: block; } .markdown-body h1{ color: #9CCEF2; } .markdown-body h2{ color: #B1D6CA; } .markdown-body h3{ color: #F5F6B6; } .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> ###### tags: `雜~~瓦魯多~~筆記` # 編譯器訊息與警告 如果程式出了語法bug,在編譯時就會被編譯器抓出來了。 不過該如何看懂編譯器給的提示呢? [TOC] ## Dev-c++ 的編譯器訊息 在程式編寫完成,按下F11編譯之後,如果有bug,編譯器就會跳出錯誤訊息,以及bug所在的行數,如下圖: ![compiler_message](https://i.imgur.com/lwKKrkZ.png =600x) 右邊的 `[Error] 'ssdr' was not declared in this scope` 就是錯誤訊息。 最左邊的 `6` 則是錯誤出現在第 6 行,行數是按照每一行旁邊的編號顯示的。 透過這些錯誤訊息,我們能更快的找出程式的 bug 出現在哪,以及 bug 的類型,方便我們進行後續的 debug (除錯)。 ## 常見錯誤訊息 ### 忘記加分號 若是執行以下程式碼: ```cpp= #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 尾端補上一個 `;` 。 ### 變數未宣告或是名稱打錯 若是執行以下程式碼: ```cpp= #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`。 ### 重複宣告兩個相同的變數 ```cpp= #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的<<打錯邊 ```cpp= #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>>' (運算子 '>>')相匹配...(下略)` 這種狀況通常是因為把大小於方向打反,導致編譯器找不到與該運算子匹配的元素。 解決方法:把寫錯的符號改掉即可。 ### 大括號少一邊 ```cpp= #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` 翻譯: `輸入的末端應該要有 '}'` 由於大括號的功能是劃分區塊用,一個大括號頭就應該要配對一個大括號尾,不然會發生區塊劃分不完全的問題。 這個錯誤訊息的行數是無法參考的,因為它只會指出最後一個大括號尾的行數,因此需要自己檢查每個括號的配對。 解決方式:一個一個括號頭與括號尾配對檢查,看是哪一個括號沒配對好。 ~~不過我個人有時是習慣直接重寫~~ ### 未引入需要的標頭檔 ```cpp= #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 上去搜尋,通常都會有人遇到一樣的問題,也會提供一些可行的解法。 不過在搜尋之前,建議自己先從字面意思,去推測看看自己錯在哪,~~順便練習下英文吧~~。