编译一个 C++ 小工程,报错第一行是 expected unqualified-id before int。下面跟着十几条连锁错误,看得人头皮发麻。这种情况九成不是编译器的问题。

unqualified-id 的意思是,编译器在这个位置期待一个合法的名字,结果看到了别的东西。最常见的场景是语句写在了函数外面,或者类定义结束忘了分号。

先看报错行的上一行

编译器报错的行号,往往不是真正出错的地方。少一个分号,报错会出现在下一行的开头。看到 expected unqualified-id,先把光标往上挪一行,检查结尾有没有分号。

struct Point { int x; int y; }

这一行少了分号,紧接着的 int main 就报错了。补上分号,后面的连锁报错通常一起消失。

函数外面不能写语句

另一种常见情况,是把赋值或者函数调用写在了全局作用域。全局位置只能放声明和定义,不能直接写 x 等于 1 这种语句。想初始化,就在定义变量时赋值,或者放进构造函数。

宏展开也是重灾区。一个带分号的宏放在 if 后面,展开后会多出半条语句,报错信息指向一个你看不懂的符号。排查时用 g++ -E 把预处理结果导出来,看展开后到底是什么。

中文标点藏得最深

从文档里复制代码,分号、括号、逗号可能被替换成了全角。全角分号长得跟英文分号差不多,肉眼很难分。把编辑器字体换成等宽,或者打开显示不可见字符,一眼就能看出来。

按顺序改,别一次改十处

十几条报错往往只有一两个真错。从第一条开始改,改完重新编译。一次改太多,新错误混进旧错误里,反而找不到北。经验是,第一条报错的位置最接近真实问题。

如果第一条改完还剩一堆,多半是某个头文件里漏了分号,顺着 include 的顺序往上找。头文件是从上往下展开的,最早引入的那个,嫌疑最大。