在Windows上的Visual Studio Code中配置C/C++运行环境

虽然在Windows上写C++程序首推Visual Studio,但是如果想要方便地运行代码片段或者编译单个文件的话,Visual Studio Code仍然是一个好选择。

首先去扩展商店中搜索并安装“C/C++”以及“Code Runner”。安装好了之后点击重新加载,以使插件生效。

Code Runner只是一个快捷运行代码的工具,我们需要准备一个编译器。如果已经安装有Visual Studio的C/C++桌面开发相关组件的话,MSVC应该是可以直接用的(只想安装VS 2017单独的C/C++工具链的话,也需要从官网下载VS的安装程序,然后只勾选必要项即可)。mingw或者WSL中的g++、Clang之类的也可以,看个人喜好。接下来以MSVC为例,配置Code Runner的命令行参数。

点击文件-首选项-设置,找到扩展标签下的Run Code configuration,修改Executor Map项(需要手动编辑JSON文件)。

fig1

settings.json分为左右两个窗格。左边是默认设置,右边是用户/工作区设置。我们在右边新增同名的键,以覆盖左边的默认值。

以命令行方式使用MSVC(cl.exe)需要配置环境变量。最简单的方式是运行VS的开发人员命令提示符脚本,它的位置可以在开始菜单里找到。

可以直接按照上面的样子配置。VsDevCmd.bat会设置相关环境变量等,然后直接cd到当前文件所在目录,调用cl即可。

配置好了之后,保存settings.json,打开一个C/C++源文件,按下F1打开命令窗口,输入Run,找到Run Code命令,运行之:

fig2

编译运行后应该能看到如下界面:

fig3

看起来一切顺利,但是还有问题:MSVC输出的中文会变成乱码。随便拿掉一个语句分号再编译,就会发现这一点。原因在于Code Runner使用管道重定向了命令输出,然后将其作为UTF-8文本显示。这在Linux下似乎没有大问题,然而由于历史原因,多数Windows下的命令行工具使用的是本机编码(GBK)。如果Locale配置无误的话,常用字符的显示在Windows终端下倒是没问题。但是我们这种情况就比较麻烦了,因为如果直接运行cl这类程序的话,它们的MBCS字符输出会被系统的ANSI系API正确处理,然后打到屏幕上;但是这里Code Runner面临的是未经处理的字节流,而它……看什么都觉得是UTF-8。虽然我们也可以通过调整code-runner.runInTerminal设置,让命令直接在终端里运行,但是比较彻底的方式是让cl直接输出UTF-8文本,或者……帮它输出。

写一个Wrapper对于熟悉Win32编程的读者来说应该不难:

稍微需要注意的是,由于GBK编码是变长的,所以当收到的第一个字节的最高位为1时,要等待第二个字节到来,再进行转换;由于我们的程序是要被Code Runner重定向STDOUT到匿名管道的,所以我们自己写控制台时就不能使用WriteConsole了,而应该使用通用的WriteFile。

编译好了之后,将这个程序命名为GBKWrapper.exe,然后丢到随便一个%PATH%内的目录即可。

要利用这个程序,只需要修改一下编译命令行:

在cl前面加上GBKWrapper,就可以看到中文的编译器输出了:

fig4

细心的读者可能看到了cl编译器选项的/utf-8。由于VSCode默认的UTF-8是不带BOM的,因此会被cl识别为当前本机编码(GBK)的文件。设置/source-charset:utf-8即可解决这个问题。/utf-8会同时设定source charset和execution charset,所以普通的字符(串)字面值也会变成UTF-8(当然,可以用前缀控制字面值编码,比如u8、u和U)。