10 个常见 C++ 编译错误 — 以及它们到底在说什么
用法:找到你的报错,跳到对应条目,修掉。先记一条总规则:只修第一个错误,然后重新编译 — 一个漏掉的分号能引发十条级联报错,第二到第十条通常修完第一条就自己消失了。
1. error: expected ';' before '}' token
含义:上面某条语句漏了分号。编译器报的位置常常在实际错误的下一行。
int x = 5 // ← 这里少了 ';'
cout << x;
修法:补分号。看到这条错,先查上一行的行尾。
2. 'cout' was not declared in this scope
含义:编译器不知道 cout 是什么 — 通常是没包含 <iostream>,或缺 using namespace std;(没有它就写 std::cout)。
#include <iostream> // 少这行:报错
using namespace std; // 少这行:'cout' 不认识
int main() {
cout << "hi" << endl;
}
3. 'x' was not declared in this scope
含义:用了一个编译器没见过的名字。两种常见原因:拼写(cont vs count — C++ 还区分大小写:Count ≠ count),或变量先用后声明。
int main() {
x = 5; // ← 报错:还不存在叫 x 的东西
int x;
}
4. fatal error: iostrem: No such file or directory
含义:某个 #include 的名字拼错了。编译器引用的是它找不到的准确名字 — 逐字符读一遍。
#include <iostrem> // ← 拼错:应为 <iostream>
5. error: invalid conversion from 'const char*' to 'char'
含义:单引号 vs 双引号。'a' 是一个字符;"a" 是字符串。在需要对方的位置用错了就出这类错(或它的表亲)。
char c = "a"; // ← "a" 是字符串;用 'a'
string s = 'a'; // ← 'a' 是字符;用 "a"
6. error: expected '}' at end of input
含义:少了右花括号。编译器读到文件末尾还在等它 — 真正的错误通常在上面很远、某个块的开头处。
修法:数括号,或让编辑器高亮配对。诚实的缩进能让失配一眼可见。
7. undefined reference to 'main' — 链接器错误
含义:注意新词:链接器,不是编译器。代码编译通过了,但没有入口 — 通常是 main 拼错(Main、mian)或根本没写。详见什么是 int main()。
int Main() { // ← 大写 M:这只是个普通函数
return 0;
}
8. undefined reference to 'sayHi()' — 也是链接器
含义:函数被声明(许了愿)却没定义(没兑现),或它的 .cpp 文件没参与编译链接。
void sayHi(); // 声明:"它存在,信我"
int main() {
sayHi(); // 链接器:"东西呢?!" — 函数体从没写过
}
9. unresolved external symbol "sayHi"(Visual Studio)
含义:和第 8 条一模一样的链接问题 — 微软编译器只是用了不同的措辞。两种说法都认识,能从搜索结果里解出来的报错就翻倍。
10. warning: 警告 — 新手最常跳过的(别跳)
含义:警告是"能编译,但味道不对":没用过的变量、未初始化的值、丢数据的隐式转换。警告不拦你 — 这正是真正的 bug 藏在后面没人看的原因。把每条警告当成一个你还没见过的 bug。
一个编译干净的程序
上面所有经典的修正版 — 修完自己的错误后跑它做个确认:
#include <iostream>
using namespace std;
void sayHi() {
cout << "hi!" << endl;
}
int main() {
int x = 5; // 先声明再使用
char c = 'a'; // 字符用单引号
cout << x << " " << c << endl;
sayHi();
return 0;
}
通用调试流程
- 只读第一条错误。修它,重新编译。(错误会级联 — 其余多半是回声。)
- 先看编译器指的那行,再看上一行。报错偏一行是常态。
- 编译错误 vs 链接错误:"error:" 是语言规则;"undefined reference / unresolved external" 是许下的函数没兑现。
- 原样搜索报错有效 — 先删掉你自己的路径和变量名,保留报错信息的样板部分。
相关:什么是 int main()(第 7 条的深挖)、cin 与 getline(新手另一半的痛苦:运行期输入 bug)、Hello World 一课(第 1 条错误在那里客串出场)。