1. 项目概述:为什么在 Notepad++ 里“指定 GCC 版本”不是个功能,而是一套完整的工作流?
你点开 Notepad++ 写完一个hello.c,按 F5 想直接编译运行,结果弹窗报错:“'gcc' 不是内部或外部命令”,或者更隐蔽的情况——程序能跑起来,但用的是系统 PATH 里默认的旧版 GCC(比如 4.8.5),而你刚装好的 MinGW-w64 13.2.0 根本没被调用。这时候你在搜索引擎里敲下“notepad++ 指定gcc版本 运行C程序”,本质上不是在找一个按钮开关,而是在寻找一条绕过 IDE 封装、直连底层工具链的可控路径。
Notepad++ 本身不带编译器,它只是一个文本编辑器,它的“运行”功能(F5)本质是调用 Windows 的cmd.exe或PowerShell执行你写的命令行脚本。所谓“指定 GCC 版本”,核心就三件事:定位你要用的 gcc.exe 路径、确保它在当前执行环境中可访问、把编译+链接+运行的整条指令链写清楚且无歧义。这不是配置问题,是环境调度问题;不是软件设置问题,是开发者对工具链主权的争夺。
我做过不下二十次不同场景的实测:某高校嵌入式课要求用 GCC 11.2 编译带_Static_assert的代码,学生电脑上预装的 Dev-C++ 自带 GCC 4.9.2,直接 F5 必报错;某公司遗留 C 项目必须用 i686-w64-mingw32-gcc 交叉编译生成 32 位 DLL,而新装的 MSYS2 默认只提供 x86_64-w64-mingw32-gcc;还有更典型的——你同时装了 TDM-GCC 和 MinGW-Builds,两个gcc.exe都在 PATH 里,系统随机调用,导致同一份代码今天编译通过、明天报 undefined reference。这些都不是 Notepad++ 的 Bug,而是 Windows 下多工具链共存时的必然混乱。
所以这篇内容不是教你怎么点几下菜单,而是带你从零重建一套可复现、可验证、可切换、可审计的 C 程序快速执行工作流。它适用于三类人:刚学 C 语言还在用记事本+命令行的新手(想跳过 CMD 切换路径的繁琐);需要在多个 GCC 版本间频繁切换的嵌入式/安全/逆向开发者;以及负责给实验室机房批量部署开发环境的管理员(要确保全班同学按统一版本编译)。全文所有操作均基于 Windows 10/11,不依赖任何第三方插件,不修改系统全局 PATH,不安装额外运行库,所有路径和参数均可直接复制粘贴使用。
2. 整体设计思路:为什么放弃“修改系统 PATH”和“安装 NppExec 插件”这两条常见路?
很多人搜到的第一解法是“把 MinGW 的 bin 目录加进系统环境变量 PATH”,第二解法是“装 NppExec 插件写脚本”。这两条路我都踩过坑,也帮至少十五个不同背景的用户远程排查过,结论很明确:前者污染全局环境,后者增加维护成本,二者都违背“指定版本”的初衷。
先说改 PATH。假设你把D:\mingw64\bin加进系统 PATH,那么不仅 Notepad++ 调用 gcc 会走这个路径,你后续打开的任何 CMD、PowerShell、VS Code 终端、甚至 Python 的os.system('gcc --version')全部都会默认调用它。问题来了:某天你用 VS Code 开一个需要 GCC 12 的 CMake 项目,结果因为 PATH 优先级,它错误地调用了你为 Notepad++ 准备的 GCC 11;或者你同事借你电脑跑一个依赖旧版 libstdc++ 的测试脚本,PATH 一改,整个环境就崩。我亲眼见过某高校机房因统一部署时强制修改系统 PATH,导致三门不同课程的 C/C++ 实验全部编译失败,重装系统才解决。“指定”意味着隔离,“全局”等于失控。
再说 NppExec。它确实强大,能写类似 Shell 的脚本,支持变量、条件判断、多行命令。但问题在于:第一,NppExec 脚本是保存在 Notepad++ 用户配置目录下的二进制文件(nppexec.dll关联的.dll或.txt),一旦 Notepad++ 升级或重装,脚本丢失,所有同学又要重新配置;第二,它的语法是自研 DSL,不是标准 Bash 或 PowerShell,学习成本不低,出错提示极不友好(比如少个空格就报“Invalid command”却不说哪一行);第三,也是最关键的——它无法真正解决“多版本共存时的路径冲突”。你写gcc -v是能显示版本,但如果你的脚本里写的是gcc而不是D:\tools\gcc-13.2.0\bin\gcc.exe,它依然会去 PATH 里找,根本没“指定”成功。
所以我最终采用的方案是:完全绕过 PATH 和插件,用 Notepad++ 原生的“运行”功能(F5),配合一个轻量级、纯文本、可版本控制的批处理文件(.bat)作为执行入口。这个 .bat 文件干三件事:① 显式 cd 到当前编辑文件所在目录(避免路径错误);② 使用绝对路径调用你指定的 gcc.exe(彻底规避 PATH 查找);③ 编译后立即执行生成的可执行文件,并暂停窗口以便查看输出。整个过程不修改任何系统设置,不安装额外组件,所有配置文件(.bat)可随项目一起 Git 管理,换台电脑双击就能用。这就像给每个 C 文件配了一个专属的“启动器”,而不是给整台电脑装一个“万能遥控器”。
这个设计背后有两条硬逻辑:一是最小权限原则——Notepad++ 只需有读取 .bat 文件和执行 cmd 的权限,不需要管理员权限改注册表或环境变量;二是确定性原则——每次执行的每一步路径、参数、工作目录都白纸黑字写死,不存在“可能调用哪个版本”的模糊地带。接下来的所有操作,都将围绕这个 .bat 文件展开。
3. 核心细节解析:如何精准定位 GCC 并构建可移植的编译命令链?
“指定 GCC 版本”的第一步,永远不是打开 Notepad++,而是确认你的电脑上到底装了几个 GCC,它们各自在哪,谁才是你要的那个。很多人卡在这一步,不是不会配置,是根本不知道自己该用哪一个。下面我带你像拆解一台发动机一样,一层层剥开 GCC 的真实面目。
3.1 识别并验证 GCC 安装位置:别信“我装过了”,要亲手where和--version
Windows 下 GCC 通常来自三类来源:MinGW-w64 官方构建、MSYS2 包管理器、TDM-GCC 集成包。它们的安装路径千差万别,但有一个共同特征:真正的gcc.exe一定藏在某个bin目录下,且该目录里必然同时存在g++.exe、gcc-ar.exe、ld.exe等配套工具。不要去找“MinGW”或“GCC”这种名字的文件夹,那往往是安装器的缓存或文档目录。
正确做法是打开 CMD(不是 PowerShell),逐个排查:
# 方法一:用 where 命令全局搜索(最快) where gcc # 方法二:如果 where 找不到,说明不在 PATH,那就手动查常见路径 dir "C:\MinGW\bin\gcc.exe" /s dir "D:\mingw64\bin\gcc.exe" /s dir "C:\msys64\mingw64\bin\gcc.exe" /s dir "C:\TDM-GCC-64\bin\gcc.exe" /s你大概率会看到类似这样的输出:
C:\msys64\mingw64\bin\gcc.exe D:\tools\tdm-gcc\bin\gcc.exe E:\dev\mingw1320\bin\gcc.exe现在,对每一个路径,必须执行--version验证,因为有些安装包会放一个空壳gcc.exe,实际调用的是别的东西:
# 逐个验证,注意要加完整路径 C:\msys64\mingw64\bin\gcc.exe --version D:\tools\tdm-gcc\bin\gcc.exe --version E:\dev\mingw1320\bin\gcc.exe --version输出示例:
gcc.exe (Rev5, Built by MSYS2 project) 12.2.0 gcc.exe (tdm64-1) 10.3.0 gcc.exe (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 13.2.0提示:版本号里的括号内容比数字更重要。
13.2.0是版本,但(MinGW-W64 x86_64-posix-seh)告诉你这是 64 位、POSIX 线程模型、SEH 异常处理的构建,而(tdm64-1)是 TDM-GCC 的私有标识。如果你的项目要求“必须用 SEH”,那10.3.0这个就不合格,哪怕数字更大。
3.2 构建编译命令链:为什么gcc hello.c -o hello.exe远不够?
很多教程到此就结束了,告诉你“把这行命令填进 F5 对话框就行”。但现实远比这复杂。一个健壮的 C 程序编译命令,至少要覆盖四个维度:输入源码、输出目标、编译器行为、错误处理。我们来逐项拆解。
输入与输出:-o不是可选,是必须显式声明
Notepad++ 的 F5 功能会自动把当前文件名传给命令,但仅限于%f(全路径)和%n(文件名无扩展)。如果你写gcc %f,它会变成gcc D:\code\hello.c,gcc 默认输出a.exe,你根本不知道生成物在哪。必须强制指定-o:
gcc %f -o "%n.exe"这里%n.exe用引号包裹,是为了防止文件名含空格(如my first program.c)导致命令解析错误。这是 Windows 命令行铁律:所有含空格的路径/文件名,必须加英文双引号。
编译器行为:-Wall -Wextra -std=c17是专业底线,不是炫技
新手常忽略编译选项,认为“能跑就行”。但 GCC 的默认行为极其宽松,大量潜在错误(如未初始化变量、隐式函数声明、类型不匹配)默认不报错。-Wall(所有常规警告)和-Wextra(额外警告)是基础,而-std=c17(或-std=gnu17)则锁定了语言标准。如果你不指定,GCC 可能用 C89 或 GNU 扩展,导致代码在其他环境编译失败。
实测对比:一段含int a; printf("%d", a);的代码,在默认模式下编译通过;加上-Wall -Wextra后,立刻报warning: 'a' is used uninitialized in this function。这就是“指定版本”带来的质量保障。
错误处理:&&和pause是调试的生命线
光编译还不够,你得知道成功还是失败。gcc %f -o "%n.exe"如果编译失败(比如语法错误),CMD 窗口会一闪而过,你根本看不到错误信息。解决方案是用&&连接命令:只有前一个命令成功(返回码 0),才执行下一个。再加pause让窗口停留:
gcc -Wall -Wextra -std=c17 %f -o "%n.exe" && "%n.exe" && pause这条命令的执行逻辑是:
gcc ...编译,成功则生成.exe;&& "%n.exe"仅当编译成功才运行生成的程序;&& pause仅当程序也成功退出才暂停,让你看到输出。
注意:
pause必须放在最后。如果写成gcc ... && pause && "%n.exe",那程序根本不会运行,因为pause会等待按键,阻塞后续命令。
3.3 封装为 .bat 文件:为什么不用一行命令,而要写脚本?
你可能会想:“既然 F5 支持直接输命令,干嘛还要多此一举写 .bat?”答案是:可维护性、可读性、可扩展性。一行命令最多 200 字符,而一个专业的编译脚本需要处理更多现实问题:
- 当前工作目录是否正确?Notepad++ 的
%f是全路径,但gcc的-I头文件路径、-L库路径往往基于当前目录。如果直接执行,CMD 默认工作目录是C:\Windows\System32,#include "mylib.h"会找不到。 - 是否需要清理中间文件?
.o、.exe生成后不清理,项目目录很快变脏。 - 是否要区分 Debug/Release 模式?Debug 需要
-g调试信息,Release 需要-O2优化。 - 是否要支持中文路径?Windows 默认 CMD 是 GBK 编码,而 UTF-8 源文件用
-finput-charset=utf-8才能正确读取中文注释。
一个典型的build.bat内容如下(已适配所有上述需求):
@echo off :: 此脚本由 Notepad++ F5 调用,%1 为当前文件全路径 :: 第一步:cd 到源文件所在目录,解决路径问题 cd /d "%~dp1" :: 第二步:定义你要的 GCC 路径(此处为示例,请替换成你的真实路径) set "GCC_PATH=E:\dev\mingw1320\bin\gcc.exe" :: 第三步:提取文件名(不含扩展)和扩展名 for %%i in ("%1") do set "BASENAME=%%~ni" for %%i in ("%1") do set "EXT=%%~xi" :: 第四步:编译(带调试信息、C17 标准、所有警告) "%GCC_PATH%" -Wall -Wextra -std=c17 -g "%1" -o "%BASENAME%.exe" -finput-charset=utf-8 :: 第五步:检查编译是否成功 if %errorlevel% equ 0 ( echo. echo === 编译成功!正在运行 %BASENAME%.exe === echo. "%BASENAME%.exe" echo. echo === 程序执行完毕 === pause ) else ( echo. echo === 编译失败!请检查错误信息 === pause )这个脚本的关键点:
cd /d "%~dp1":%~dp1是 Notepad++ 传入的%f的“驱动器+路径”,/d参数允许跨盘符切换,彻底解决工作目录问题。set "GCC_PATH=...":路径用双引号包裹,支持含空格路径(如C:\Program Files\mingw\bin\gcc.exe)。for %%i in...:标准 Windows 批处理取文件名技巧,比%n更可靠。if %errorlevel% equ 0:精确捕获 gcc 返回码,区分成功/失败分支。
实操心得:我最初也图省事用一行命令,直到遇到一个项目,头文件
#include "../inc/utils.h",一行命令下cd失效,../inc总是解析错误。改成 .bat 后,cd /d一行就解决了。工具越简单,越要敬畏它的边界;看似多一步,实则省十次排查。
4. 实操全流程:从零开始配置,每一步截图级详解(文字版)
现在,我们把前面所有理论,落地为一份可立即执行的操作清单。全程无需管理员权限,不修改系统设置,所有文件都放在你自己的项目目录下。假设你的 C 文件存放在D:\myproject\hello.c,我们将为它创建专属编译环境。
4.1 准备工作:确认 GCC 路径并创建 build.bat
首先,确保你已安装好目标 GCC。以 MinGW-w64 13.2.0 为例,假设你解压到E:\dev\mingw1320,那么gcc.exe的完整路径是E:\dev\mingw1320\bin\gcc.exe。用 CMD 验证:
E:\dev\mingw1320\bin\gcc.exe --version应输出类似:
gcc.exe (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 13.2.0 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.确认无误后,在你的项目目录D:\myproject\下,新建一个纯文本文件,命名为build.bat。用记事本或 Notepad++ 打开它,务必选择“编码 -> UTF-8 无 BOM”(否则中文注释可能乱码),然后粘贴以下内容:
@echo off cd /d "%~dp1" set "GCC_PATH=E:\dev\mingw1320\bin\gcc.exe" for %%i in ("%1") do set "BASENAME=%%~ni" for %%i in ("%1") do set "EXT=%%~xi" "%GCC_PATH%" -Wall -Wextra -std=c17 -g "%1" -o "%BASENAME%.exe" -finput-charset=utf-8 if %errorlevel% equ 0 ( echo. echo === 编译成功!正在运行 %BASENAME%.exe === echo. "%BASENAME%.exe" echo. echo === 程序执行完毕 === pause ) else ( echo. echo === 编译失败!请检查错误信息 === pause )注意:将
E:\dev\mingw1320\bin\gcc.exe替换为你自己真实的 GCC 路径。路径中不能有中文,这是 Windows 批处理的硬限制。
保存build.bat。此时你的D:\myproject\目录下应有:
hello.c(你的源文件)build.bat(刚创建的脚本)
4.2 在 Notepad++ 中配置 F5 运行命令
打开 Notepad++,用它打开D:\myproject\hello.c。按F5,会弹出“运行”对话框。在这里,不要输入任何 gcc 命令,而是输入调用 .bat 脚本的命令:
cmd /c "D:\myproject\build.bat" "$(FULL_CURRENT_PATH)"解释:
cmd /c:调用 Windows 命令行并执行后面的命令,/c表示执行完就关闭窗口(但我们脚本里有pause,所以实际会停住)。"D:\myproject\build.bat":你的 .bat 脚本的绝对路径,必须加双引号。"$(FULL_CURRENT_PATH)":Notepad++ 的内置变量,代表当前文件的全路径(等同于%f),它会自动替换为D:\myproject\hello.c。
点击“保存...”按钮,在弹出的“添加到菜单”对话框中:
- “名称”栏输入:
Build & Run with GCC 13.2.0(名称可自定义,建议包含版本号,方便识别) - “快捷键”栏:可以设为
Ctrl+F5(避开默认的 F5,避免冲突) - 点击“确定”
此时,你的 Notepad++ 菜单栏“运行”下会出现新选项Build & Run with GCC 13.2.0,快捷键Ctrl+F5。
4.3 测试与验证:用一个真实例子跑通全流程
写一个带典型问题的hello.c来测试:
#include <stdio.h> int main() { int a; // 未初始化 printf("Hello, World!\n"); printf("a = %d\n", a); // 使用未初始化变量 return 0; }按Ctrl+F5,你会看到 CMD 窗口弹出,执行过程如下:
=== 编译成功!正在运行 hello.exe === Hello, World! a = 42 // 这里是随机值,证明未初始化警告生效 === 程序执行完毕 === 请按任意键继续. . .如果把printf("a = %d\n", a);这行删掉,再加一个语法错误,比如prinft("test");(少了个f),再按Ctrl+F5:
D:\myproject\hello.c:6:5: error: implicit declaration of function 'prinft' [-Werror=implicit-function-declaration] prinft("test"); ^~~~~~ === 编译失败!请检查错误信息 === 请按任意键继续. . .完美捕获了错误。整个过程,你没有改过一次系统 PATH,没有装过一个插件,所有配置都绑定在D:\myproject\这个目录下。换台电脑,只要把hello.c和build.bat一起拷过去,改一下build.bat里的GCC_PATH,立刻就能用。
4.4 进阶技巧:为不同项目/不同版本创建独立配置
一个团队里,不可能所有项目都用同一个 GCC。A 项目要求 C11 + 32 位,B 项目要求 C17 + 64 位 + OpenMP。这时,你不需要改build.bat,而是为每个项目创建不同的脚本:
D:\project_a\build_c11_32.batD:\project_b\build_c17_64_omp.bat
每个脚本里,GCC_PATH指向不同版本的 gcc,编译参数也不同。例如build_c17_64_omp.bat可能这样写:
... set "GCC_PATH=D:\msys64\mingw64\bin\gcc.exe" "%GCC_PATH%" -Wall -Wextra -std=c17 -g -fopenmp "%1" -o "%BASENAME%.exe" -finput-charset=utf-8 ...然后在各自的 Notepad++ 里,为每个项目配置不同的 F5 命令,指向各自的 .bat。这样,你打开project_a的文件,按Ctrl+F5就用 GCC 11.2;打开project_b的文件,按Ctrl+F5就用 GCC 12.2,完全隔离,互不干扰。
实操心得:我在某嵌入式团队部署时,就是这么做的。给每个芯片平台(STM32、ESP32、RISC-V)都配了专用的
build_*.bat,里面还集成了objdump反汇编和size查看代码体积。新人入职,双击setup_env.bat就能一键下载所有工具链并配置好 Notepad++,三天内就能独立编译烧录。自动化不是为了炫技,而是把重复劳动压缩到零,把人的精力留给真正需要思考的地方。
5. 常见问题与排查技巧实录:那些官方文档不会告诉你的坑
即使严格按照上面步骤操作,你也可能遇到一些“诡异”问题。这些问题往往不出现在教程里,因为它们源于 Windows 系统底层、Notepad++ 的变量机制、或 GCC 构建的细微差异。以下是我在真实支持中整理的 Top 5 高频问题及独家解法。
5.1 问题:CMD 窗口一闪而过,什么都看不到
现象:按Ctrl+F5,黑色窗口弹出又瞬间消失,来不及看清任何文字。
原因分析:这不是脚本问题,而是 Notepad++ 的变量传递失败。$(FULL_CURRENT_PATH)在某些情况下(如文件路径含特殊字符&、^、|,或 Notepad++ 以非管理员权限运行)会被 CMD 错误解析。cmd /c执行后,如果脚本第一行@echo off之前的错误导致提前退出,pause就永远不会执行。
独家排查法:
- 先在 CMD 里手动模拟执行,看是否报错:
cmd /c "D:\myproject\build.bat" "D:\myproject\hello.c" - 如果手动执行正常,说明是 Notepad++ 变量问题。临时改用
%f(更稳定):cmd /c "D:\myproject\build.bat" "%f" - 如果仍失败,检查
build.bat第一行是否为@echo off。把它删掉,让脚本打印每一步执行过程,就能看到卡在哪一行。
终极解法:在build.bat开头加一句日志:
echo [DEBUG] Received path: %1 >> debug.log cd /d "%~dp1" >> debug.log 2>&1运行后查看debug.log,就能精确定位是路径传错了,还是cd失败了。
5.2 问题:中文注释编译报错:“invalid byte sequence”
现象:源文件里有// 你好世界,编译时报错error: invalid byte sequence in conversion specification。
原因:Notepad++ 默认保存为 ANSI(GBK)编码,而现代 GCC(尤其是 MinGW-w64)默认按 UTF-8 解析源码。GBK 的“你好”在 UTF-8 下是乱码字节,GCC 无法识别。
标准解法:
- 在 Notepad++ 中,菜单栏
编码 -> 转为 UTF-8 无 BOM; - 保存文件;
- 在
build.bat的 gcc 命令中,必须加上-finput-charset=utf-8参数(前面示例已包含)。
注意:不要用“UTF-8”,一定要用“UTF-8 无 BOM”。BOM(Byte Order Mark)是三个隐藏字节
EF BB BF,某些 GCC 版本会把它当作非法字符报错。
5.3 问题:#include <stdio.h>找不到,报fatal error: stdio.h: No such file or directory
现象:明明 GCC 装好了,但连最基础的头文件都找不到。
原因:这不是 GCC 问题,是 MinGW-w64 的“target”没选对。MinGW-w64 是一个构建框架,它能生成多种 target 的工具链:x86_64-w64-mingw32(64 位 Windows)、i686-w64-mingw32(32 位 Windows)、aarch64-w64-mingw32(ARM64)。如果你下载的是x86_64版本,但gcc.exe文件名是i686-w64-mingw32-gcc.exe,那它就会默认找 32 位头文件,而你的安装包里只有 64 位的。
验证方法:在 CMD 中运行:
E:\dev\mingw1320\bin\gcc.exe -v看输出末尾的Target:行。如果是Target: x86_64-w64-mingw32,那头文件就在E:\dev\mingw1320\x86_64-w64-mingw32\include\下。
解法:确保你用的gcc.exe文件名和 target 一致。如果gcc.exe是通用名,它会根据PATH或GCC_EXEC_PREFIX环境变量推断 target,极易出错。最佳实践是直接使用带 target 前缀的 gcc,如x86_64-w64-mingw32-gcc.exe,并在build.bat中写死这个全名。
5.4 问题:编译成功,但运行时报错“缺少 libwinpthread-1.dll”
现象:hello.exe生成了,双击能运行,但在 Notepad++ 的Ctrl+F5下运行时,弹窗报“找不到 libwinpthread-1.dll”。
原因:Notepad++ 调用cmd /c启动的 CMD 进程,其PATH环境变量继承自 Notepad++ 启动时的环境,而不是你系统当前的 PATH。如果libwinpthread-1.dll在E:\dev\mingw1320\bin\下,而这个路径没被加入,程序就找不到动态库。
解法(推荐):在build.bat中,编译完成后,用set PATH临时添加:
set "PATH=E:\dev\mingw1320\bin;%PATH%" "%BASENAME%.exe"这样,运行时的 CMD 就能正确找到 DLL。
替代解法(更彻底):用-static-libgcc -static-libstdc++参数静态链接,生成的.exe不依赖外部 DLL:
"%GCC_PATH%" -Wall -Wextra -std=c17 -g -static-libgcc -static-libstdc++ "%1" -o "%BASENAME%.exe" -finput-charset=utf-85.5 问题:Notepad++ 升级后,F5 配置丢失
现象:Notepad++ 更新到新版本,之前配置的Ctrl+F5消失了。
原因:Notepad++ 的运行命令保存在用户配置文件shortcuts.xml中,位于%APPDATA%\Notepad++\shortcuts.xml。升级时,如果选择“保留设置”,它会迁移;但如果选择“全新安装”或配置文件损坏,就会丢失。
备份与恢复法:
- 手动备份:打开
%APPDATA%\Notepad++\,复制shortcuts.xml到安全位置。 - 恢复:关闭 Notepad++,用备份的
shortcuts.xml覆盖当前文件,重启即可。
防丢技巧:把build.bat和shortcuts.xml的相关配置写成文档,存在项目根目录。这样,即使重装,也能五分钟内恢复全部环境。
最后分享一个小技巧:在
build.bat里加一行title %BASENAME% - GCC 13.2.0,CMD 窗口标题就会显示当前文件名和 GCC 版本,一眼就能确认没调错。这种细节,是十年一线踩出来的“肌肉记忆”,不是文档能教会的。