如何像Python一样编译C++代码
0. 简介Python作为一门解释型编程语言对于人类十分友好使用起来非常方便但是计算机运行起来比其它编译型语言慢很多。C作为一门编译型编程语言与Python完全相反对于人类十分不友好使用起来非常不方便但是计算机运行起来飞快。比如运行一个 Python 源代码文件时我们只需要在终端里使用下面这行命令py .\hello.py运行效果而 编译一个 C 程序并运行我们可能需要以下命令我这里的源代码文件是用UTF8格式编码的而中国 Windows 系统的终端默认是用GBK中文编码的所以导致中文部分的源代码解析错误打印出来是乱码(C烦人问题的其中一个我们后面会解决)源码#includeiostreamusingnamespacestd;intmain(){coutHello, World!endl;cout你好, World!endl;}对于C入门或者是学习C信奥算法的孩子们来说这些编码、命令等非常烦人为了在学习过程中更快的调试程序我们可以通过一些配置让C的编译运行过程 “像” Python一样方便我们的最终目标是实现一行命令编译并运行1. 安装 Python 解释器 (管家)本文只介绍Windows系统的安装方法主要是想推荐一下最新的Python Install Managerpymanager下载页面https://www.python.org/downloads/如果你的页面是下面这样的先别着急点击按钮等它完全加载之后应该会变成下面这样点击之后浏览器会自动开始下载下载之后是一个.msix文件打开这个文件这里有pymanager的命令介绍大家可以自己阅读一下比如我们可以在终端 (PowerShell) 中输入py list查看当前已安装的Python解释器py listWin X快捷键打开菜单里面有终端如果电脑里有Python这里会显示具体版本我这是没有安装的例子输入py install default安装当前最新正式版 Python 解释器py install default安装完成输入python命令测试一下能否运行交互式python解释器安装完毕Ctrl D退出交互式Python重新运行py list查看已安装Python想要让解释器运行某个Python代码文件(模块)可以在该文件所在文件夹内打开终端或者在终端中用命令将终端工作目录移动到目标文件夹 (不会的可以自行AI)输入py加目标文件名可以只写前几个字母按Tab键系统会有补全提示pymanager会自动选择刚刚安装的Python解释器解释并运行运行结果全部安装完毕可以关闭所有终端窗口啦2. 安装 C 编译器C的编译器五花八门各种历史版本、分支新人了解起来十分麻烦不像Python有一个官方我这只分享其中一种编译器大家也不用去网站下载了有可能下载还要挂“梯子”不然龟速下载。我放在Gitee上了版本是GCC15.2https://gitee.com/LibraTennyson/file-sharingMinGW全称Minimal GNU Windows极简版GNU编译器给Windows用的。就是把Linux上的GCC编译器改成能在Windows系统上直接运行的一套工具包GCC全称GNU Compiler CollectionGNU编译器集合GNU是一个做开源软件的组织GCC里包含了多种语言的编译器gcc.exe 可以编译C语言g.exe 可以编译C语言下载后把这个压缩包放在一个自己记得住的文件夹内比如放在一个叫C编译器的文件夹内这个文件夹的位置别忘了在哪然后创建一个名为mingw_x86_64-15.2.0的空文件夹待会编译器会放在里面文件名是为了帮助以后回忆起来这个编译器的版本(C的编译器版本不像Python的版本那么好区分)解压我们下载的压缩包这个压缩包里面有一个叫mingw64的文件夹(如果你用的是WinRAR选择解压到当前文件夹即可)把mingw64文件夹拖到我们刚刚创建的mingw_x86_64-15.2.0文件夹中进入mingw64的bin文件夹找到g.exe选中它然后按Ctrl Shift C快捷键保存文件路径按Win X在弹出菜单中点击系统在设置页面中点击高级系统设置点击环境变量找到系统变量里的Path双击打开新建然后按下Ctrl V粘贴刚刚复制的路径即可如果没有可以回去重新复制一下路径可以把最后的g.exe这个部分删了因为bin文件夹里有很多程序这样以后这个文件夹里的程序都可以直接用名字调用了我们打开一个终端输入g --version看看能否使用g.exeg --version可以看到显示信息和我们下载的版本一致C的编码问题我们还没解决这里暂时不演示编译代码g命令配置完成即可3. 安装IDE1、Dev Chttps://gesp.ccf.org.cn/101/1002/10032.html2、Zedhttps://zed.dev3、TRAEhttps://www.trae.cn/ 注意是下载TRAE IDE哦Dev C我就不多说了C少儿编程考试和比赛都指定这个软件但是Dev C太老了代码提示几乎为0视觉观感也不好看久了眼睛不舒服代码折叠等辅助功能也不完善除了考试的时候忍忍考前模拟熟悉一下平时还是用其它IDE练习更方便Zed 是用 Rust 编程语言编写的运行起来十分流畅代码辅助功能十分完善而且可以一键关闭所有AI功能在练习时可以不被AI补全功能打扰TRAE就是纯AI IDE了强依赖AI的项目可以用它大家自己研究研究怎么安装哈我就不详细介绍了4. Zed 项目配置我们可以在桌面新建一个文件夹叫AlgorithmPractice以后做算法练习时可以把代码都放在这个文件夹里我们打开Zed先打开设置我们先把AI关了打开文件夹选择你刚刚创建的文件夹在左侧工作目录下右键新建文件输入文件名C_UTF8.cpp编写代码#includeiostreamusingnamespacestd;intmain(){couthello, worldendl;cout你好worldendl;}按Ctrl J快捷键在 Zed 内打开终端输入命令g .\C_UTF8.cpp -o main运行结束后我们可以在左侧目录下看到多了一个main.exe文件继续输入命令.\main.exe正常情况下中文部分会输出乱码前面也提到过Zed默认文件编码都是UTF8格式而中国Windows系统的终端默认编码格式是GBK格式4.1 终端格式我的终端格式这个样子是设置过的默认的格式应该是在一行的我设置之后路径和命令分为两行显示接下来我讲讲怎么设置在终端中输入zed $PROFILE会用 Zed 打开PowerShell配置文件(输入zed $PR然后按Tab键会有补全提示)在文件中输入以下代码# 自定义提示符格式 function prompt { # 显示当前路径然后换行再显示 符号 $(Get-Location)n }按Ctrl S保存关闭刚刚的终端按Ctrl J重新打开一个终端现在就是更新后的格式4.2 快速切换编码刚刚由于我们的终端是GBK格式所以运行UTF8格式的代码时中文部分是乱码我们在配置文件中添加以下代码# 开机默认UTF8编码永久设置控制台代码页UTF8 chcp 65001 | Out-Null # 同步PowerShell管道输出编码解决C程序中文乱码 $OutputEncoding [Console]::OutputEncoding [System.Text.Encoding]::UTF8 # 一键切UTF8 function Set-UTF8 { chcp 65001 | Out-Null $OutputEncoding [Console]::OutputEncoding [System.Text.Encoding]::UTF8 Write-Host 已切换终端编码UTF-8 (65001) -ForegroundColor Cyan } # 一键切GBK function Set-GBK { chcp 936 | Out-Null $OutputEncoding [Console]::OutputEncoding [System.Text.Encoding]::Default Write-Host 已切换终端编码GBK (936) -ForegroundColor Yellow }这段代码可以让终端每次启动时自动切换为UTF8编码格式如果想要切换也可以使用Set-GBK、Set-UTF8来快速设置编码格式同样的保存文件关闭终端重新打开终端你可以在终端中运行一下Set-GBK或Set-UTF8命令你会发现乱码这是因为我们刚刚用zed $PROFILE的时候系统自动新建的配置文件为UTF8格式要想正常显示中文我们得用UTF-8-BOM格式保存我们先找到这个配置文件的位置把Microsoft.PowerShell_profile.ps1这个文件用Windows记事本打开点击另存为保存时类型选所有编码格式选UTF-8 BOM文件名和之前保持一直提示文件已存在确认替换保存之后重新打开终端再运行Set-GBK或Set-UTF8命令就都正常了我们切换为UTF8格式然后重新运行一下我们之前编译的main.exe文件现在就能正常运行UTF8格式的C代码了4.3 简化编译运行命令我们之前C的命令分为两行一行编译一行运行编译生成的exe文件g .\C_UTF8.cpp -o main .\main.exe我们要通过添加PowerShell配置实现一行命令完成编译、运行g .\C_UTF8.cpp只需要继续在PowerShell配置文件中添加下面代码function g { # 新增快速透传判断非编译运行场景直接调用原生g $passThroughArgs (--version, --help, -v, -c, -E, -S, -MM, -M) $shouldPassThrough $false foreach ($arg in $args) { if ($passThroughArgs -contains $arg) { $shouldPassThrough $true break } } # 命中透传规则原封不动调用原生g.exe直接返回 if ($shouldPassThrough) { g.exe args return } # $outName main $userSpecifiedOut $false $newArgs () # 解析参数找出用户是否指定了 -o for ($i 0; $i -lt $args.Count; $i) { $arg $args[$i] if ($arg -eq -o -and $i1 -lt $args.Count) { $outName $args[$i1] $userSpecifiedOut $true $i # 跳过文件名参数 # 不把 -o 和文件名加入 $newArgs } else { $newArgs $arg } } # 构建传给 g.exe 的参数 if (-not $userSpecifiedOut) { # 用户未写 -o自动添加 -o main.exe $finalArgs (-o, main.exe) $newArgs } else { # 用户已写 -o保留原样 $finalArgs (-o, $outName) $newArgs } # 执行编译启用 C11 g.exe -stdc11 finalArgs # 若编译成功运行生成的程序 if ($LASTEXITCODE -eq 0) { Write-Host n编译成功正在运行... -ForegroundColor Green if ($userSpecifiedOut) { # 自动添加 .exe 后缀如果用户指定的输出名不含 .exe $runExe if ($outName -match \.exe$) { $outName } else { $outName.exe } .\$runExe } else { # 默认输出 main.exe 位于当前目录 .\main.exe } } else { Write-Host n编译出错程序未运行 -ForegroundColor Red } }现在我们执行g指令就可以直接编译并运行了g .\C_UTF8.cpp记得重启终端具体什么原理大家可以复制给AI让AI给你解读(本来我也是让AI写的)这个PowerShell配置文件是对所有终端生效的哪怕不开启IDE直接在终端中也可以使用我们设置的这些特性完整配置代码# 本文件现在用 UTF-8 with BOM 编码 # 自定义提示符格式 function prompt { # 显示当前路径然后换行再显示 符号 $(Get-Location)n } # 开机默认UTF8编码永久设置控制台代码页UTF8 chcp 65001 | Out-Null # 同步PowerShell管道输出编码解决C程序中文乱码 $OutputEncoding [Console]::OutputEncoding [System.Text.Encoding]::UTF8 # 一键切UTF8 function Set-UTF8 { chcp 65001 | Out-Null $OutputEncoding [Console]::OutputEncoding [System.Text.Encoding]::UTF8 Write-Host 已切换终端编码UTF-8 (65001) -ForegroundColor Cyan } # 一键切GBK function Set-GBK { chcp 936 | Out-Null $OutputEncoding [Console]::OutputEncoding [System.Text.Encoding]::Default Write-Host 已切换终端编码GBK (936) -ForegroundColor Yellow } function g { # 新增快速透传判断非编译运行场景直接调用原生g $passThroughArgs (--version, --help, -v, -c, -E, -S, -MM, -M) $shouldPassThrough $false foreach ($arg in $args) { if ($passThroughArgs -contains $arg) { $shouldPassThrough $true break } } # 命中透传规则原封不动调用原生g.exe直接返回 if ($shouldPassThrough) { g.exe args return } # $outName main $userSpecifiedOut $false $newArgs () # 解析参数找出用户是否指定了 -o for ($i 0; $i -lt $args.Count; $i) { $arg $args[$i] if ($arg -eq -o -and $i1 -lt $args.Count) { $outName $args[$i1] $userSpecifiedOut $true $i # 跳过文件名参数 # 不把 -o 和文件名加入 $newArgs } else { $newArgs $arg } } # 构建传给 g.exe 的参数 if (-not $userSpecifiedOut) { # 用户未写 -o自动添加 -o main.exe $finalArgs (-o, main.exe) $newArgs } else { # 用户已写 -o保留原样 $finalArgs (-o, $outName) $newArgs } # 执行编译启用 C11 g.exe -stdc11 finalArgs # 若编译成功运行生成的程序 if ($LASTEXITCODE -eq 0) { Write-Host n编译成功正在运行... -ForegroundColor Green if ($userSpecifiedOut) { # 自动添加 .exe 后缀如果用户指定的输出名不含 .exe $runExe if ($outName -match \.exe$) { $outName } else { $outName.exe } .\$runExe } else { # 默认输出 main.exe 位于当前目录 .\main.exe } } else { Write-Host n编译出错程序未运行 -ForegroundColor Red } }5. Dev C的GBK格式由于Dev C读取和保存代码的格式就是GBK(因为我们是中文系统)所以你其它编辑器写的代码(UTF8格式)用Dev C打开中文部分都是乱码输出结果自然也是乱码那如果有些时候想用Dev C练习怎么办可以用Dev C新建一个文件保存的时候在文件名中添加GBK后缀显示的告诉自己这个文件是GBK格式Zed能正常读取GBK格式的源代码如果想在Zed中用终端运行代码只要先Set-GBK然后再用g命令编译并运行即可6. 使用 TRAE 转换文件编码格式TRAE有很多很好用的功能大家可以自己摸索我在这里介绍一个TRAE 默认打开文件的格式是UTF8我们可以点击右下角的编码格式UTF-8选择通过编码重新打开可以选择GBK格式打开现在就显示正常了如果我们相把这个文件改变为UTF8格式编码可以再点击右下角的编码格式点击通过编码保存TRAE 会重新写入文件用新的编码格式保存这样可以很方便的切换文件的编码格式不用每次都另存为