<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所在的行數,如下圖:

右邊的 `[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 上去搜尋,通常都會有人遇到一樣的問題,也會提供一些可行的解法。
不過在搜尋之前,建議自己先從字面意思,去推測看看自己錯在哪,~~順便練習下英文吧~~。