报错“stray 'ï' in program”是UTF-8 BOM()导致,gcc不识别BOM,需用VS Code保存为UTF-8(无BOM)或sed命令清除文件头三字节。

报错 stray 'ï' in program 基本就是 UTF-8 BOM 头在作怪
gcc 和大多数 Linux 下的编译器根本不认 UTF-8 BOM( 这三个字节),一读到文件开头就直接报错,而且错误行号永远是第 1 行。这不是你代码写错了,是文件本身带了“看不见的脏东西”。file -i your_file.cpp 如果输出含 charset=utf-8; with BOM,基本可以锁死问题。
VS Code 里快速去 BOM 的操作路径
右下角状态栏点击当前编码名(比如 “UTF-8”)→ 弹出菜单选 Save with Encoding → 再选 UTF-8(注意不是 UTF-8 with BOM)。保存后重编译,90% 以上立刻通过。别点“Reload with Encoding”,那只是临时切换查看方式,不改文件内容。
命令行批量清除 BOM(适合工程里一堆 .h/.cpp 文件)
用 sed 直接删开头三字节最稳妥:
sed -i '1s/^//' *.cpp *.h
如果系统不支持 -i(如 macOS),换成:
立即学习“C++免费学习笔记(深入)”;
for f in *.cpp *.h; do sed '1s/^//' "$f" > "$f.tmp" && mv "$f.tmp" "$f"; done
- 这个操作只动文件头,不影响任何代码逻辑
- 别用
iconv -f utf-8 -t utf-8//IGNORE,它可能误删合法非 ASCII 字符(比如中文注释) - 如果文件里真有中文注释,确保编辑器和编译器都明确支持 UTF-8(gcc 默认支持,但得保证没 BOM)
从 Windows 记事本或 Notepad++ 拿来的文件要特别小心
Windows 记事本默认存为 UTF-8 with BOM;Notepad++ 在“编码”菜单里如果显示 UTF-8-BOM,就说明已中招。临时救急法:把报错文件全选复制 → 粘贴进 macOS 的 TextEdit(先切到 Format → Make Plain Text)或 Windows 记事本 → 再全选复制回原编辑器并保存。这个过程天然剥离 BOM 和多数零宽字符。
真正容易被忽略的是:BOM 错误一定出现在第 1 行,但编译器有时会连带报出后续几行的 stray '»'、stray '¿' —— 它们只是 BOM 拆开后的三个字节,不用单独处理,清掉 BOM 就全消失。


















