Configure Visual Studio Code to Use Visual Studio 2010 VC Compiler and Debugger

我听说,你们要用VS 2010来写C代码?

引子

如果你想不开,要用C来入门程序设计

下面是极简名词解释,希望它们没有让你感到困惑:

  • Visual Studio Code/VS Code: 微软出品的文本编辑器。有丰富的插件支持,你可以事实上把它当很多语言的IDE用。
    • IDE/Integrated Development Environment:集成开发环境。一套用来编写其他软件的软件,通常至少含有:
      1. Editor/文本编辑器:用来浏览和编辑代码。
      2. Compiler/编译器套件:用来把代码变成软件。
      3. Debugger/调试器:用来辅助程序员检查代码中的bug。
  • Visual Studio 2010 VC/VS 2010,微软出品的C++IDE,其中使用的编译器是MSVC
    • C++: 一门程序设计语言。顾名思义,它可以不严格地看成是C的超集
      1. 超集:如果C++是C的超集,那么C是C++的子集。
    • MSVC:微软出品的C和C++的编译器,VS 2010中,它的具体的版本号是用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.40219.01 版

所以,如果想要学习C,你有很多IDE可选。或者如果你希望的话,也可以手动选择喜欢的编辑器和编译器1

如果你想不开,要用VS 2010来入门C

下面是VS 2010的糟糕之处:

  • 它事实上是一个C++的IDE,因为它对C的支持不好:事实上是几乎只支持C89
    • C89:C语言的一个标准,顾名思义它由ANSI/American National Standards Institut大概发布在1989年。C89太古老了。
      • 标准:作为人造语言,语法和语义需要被人为厘定,并且可以出于需要,在未来加以改变。
  • 它本身也是十年前的软件了,缺乏现代的IDE具有的优秀功能,比如好用的静态分析工具和可读性良好的编译器警告和报错信息
    • 静态分析:在编译之前对代码进行分析,指出代码中的不足,提醒程序员改正。
    • 编译器警告和报错信息:在编译时编译器会对它认为不好或者有错误的代码进行警告和报错,提醒程序员改正。

所以,如果想要学习C,VS 2010是一个糟糕透顶的选择。

如果你不得不用它写C,你该怎么办

我们打算使用如下的组合:

  • 文本编辑器:VS Code
  • 静态检查工具:Clang
  • 编译器套件和调试器:VS 2010自带的MSVC和cppvsdbg

下面我们介绍如何配置它们。

配置

Visual Studio 2010 VC

下载

从微软的网站上下载

坏消息(或者说好消息)是,微软似乎已经撤掉了Visual Studio 2010 VC的安装包在它的官网上。

不过你可以按照这里的指引,登录你的微软账号,并且加入Visual Studio Dev Essentials来得到对老版本的Visual Studio的安装包的访问权。 一旦加入成功,你可以在这个页面的搜索框里键入关键词并且回车得到相关的安装包。

我们需要的是:

  1. Visual Studio 2010 VC Express: VS2010的学习版。
    • 没错,其实Visual Studio 2010是一个IDE系列的合称,其中含有下述四种IDE,而我们需要的只是Visual Studio 2010 VC而已。
      1. Visual Studio 2010 VC:Visual C++
      2. Visual Studio 2010 VB:Visual Basic
      3. Visual Studio 2010 VCS:Visual C#
      4. Visual Studio 2010 VWD:Visual Web Developer
    • 没错,对于前述的每个IDE,都有若干种版本,我们需要的是免费的Express版/学习版。
    • 注意,你可以在这个页面得到一个激活码,如果没搞错的话应该是6VPJ7-H3CXH-HBTPT-X4T74-3YVY7
  2. Visual Studio 2010 Service Pack 1: VS2010的升级包,需要本体安装之后才能安装。
从本站下载

或者你总能设法在各种奇怪的地方搞到VS 2010的安装镜像和密钥的。 或者如果你懒得去找的话,这里有一份Visual Studio 2010 VC Express的在线安装包。这里是升级包。

安装

安装时,一路下一步就好,所有可选组件都是不必要的。 安装完成后,在工具栏里找到帮助-注册产品,然后输入密钥就好。

最后,学习版默认使用一种简化的工具栏布局,有时候容易让人找不到需要的选项。你可以在工具栏里找到工具-设置,然后选中专家设置

Checkpoint

你应该可以在开始菜单里找到Visual Studio 2010文件夹,你可以试着双击其中的Visual Studio 命令提示(2010)。 你应该看到有控制台窗口弹出,其中有这样的提示:Setting environment for using Microsoft Visual Studio 2010 x86 tools.。 你可以尝试输入cl并回车,你应该可以看到:用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.40219.01 版

Visual Studio Code

下载安装

这里下载Visual Studio Code的安装包并安装。

安装时记得勾选添加到PATH,推荐勾选将“通过Code打开”操作添加到Windows资源管理器目录上下文菜单。安装完成之后重启。

Checkpoint

你可以打开控制台窗口,尝试输入code并回车,你应该可以看到一个Visual Studio Code的窗口出现。

插件

安装这几个插件:

  1. C/C++
  2. C/C++ Clang Command Adapter
  3. Chinese (Simplified) Language Pack for Visual Studio Code

配置文件

找一个好的文件夹用来存放你的代码。 在这个文件夹里,新建名为.vscode的文件夹,在其中创建下述四个文件:

  1. c_cpp_properties.json
    {
     "configurations": [
         {
             "name": "Win32",
             "includePath": [
                 "${workspaceFolder}/**",
                 "C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/include"
             ],
             "defines": [
                 "_DEBUG",
                 "UNICODE",
                 "_UNICODE"
             ],
             "cStandard": "c89",
             "cppStandard": "c++98",
             "intelliSenseMode": "clang-x86",
             "compilerPath": "C:/Program Files/LLVM/bin/clang.exe"
         }
     ],
     "version": 4
    }
    
  2. launch.json
    {
     "version": "0.2.0",
     "configurations": [
       {
         "name": "MSVC Build all files in cwd",
         "type": "cppvsdbg",
         "request": "launch",
         "program": "${fileDirname}\\a.exe",
         "args": [],
         "stopAtEntry": true,
         "cwd": "${fileDirname}",
         "environment": [],
         "externalConsole": true,
         "preLaunchTask": "MSVC Build all files in cwd"
       }
     ]
    }
    
  3. settings.json
    {
     "workbench.colorTheme": "Default Light+",
     "workbench.startupEditor": "newUntitledFile",
     "terminal.integrated.shell.windows": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
     "C_Cpp.experimentalFeatures": "Enabled",
     "C_Cpp.clang_format_sortIncludes": true,
     "explorer.confirmDelete": false,
     "clang.cflags": [
         "-ansi",
         "-pedantic",
         "-Wall",
         "-Wextra",
         "-Wdeclaration-after-statement",
         "-Wunreachable-code",
         "-Wshadow",
         "-Wold-style-definition",
         "-Wno-long-long",
         "-Wstrict-prototypes"
     ],
     "clang.cxxflags": [
         "-ansi",
         "-pedantic",
         "-Wall",
         "-Wextra",
         "-Wdeclaration-after-statement",
         "-Wunreachable-code",
         "-Wshadow",
         "-Wold-style-definition",
         "-Wno-long-long",
         "-Wstrict-prototypes"
     ],
     "C_Cpp.autocomplete": "Disabled",
     "C_Cpp.default.intelliSenseMode": "clang-x86",
    }
    
  4. tasks.json
    {
      "version": "2.0.0",
      "tasks": [
     {
       "type": "shell",
       "label": "MSVC Build all files in cwd",
       "command": "cl.exe",
       "options": {
         "cwd": "${fileDirname}"
       },
       "args": [
         // The /Z7 option produces object files that also contain full symbolic debugging information for use with the debugger.
         "/Z7",
         // C compiler conforms strictly to the C89/C90 standard. Should turn off or
         // "/Za",
         // stack frame run-time error checking, when a variable is used without having been initialized
         "/RTC1",
         // Analysis output goes to the console or the Visual Studio Output window like other error messages
         // Not avilable for MSVC 16.00
         // "/analyze",
         // Suppresses the display of the copyright banner when the compiler starts up and display of informational messages during compiling.
         "/nologo",
         // /W3 displays level 1, level 2, and level 3 (production quality) warnings. /W3 is the default setting in the IDE.
         "/W3",
         // Suppresses the compiler warning that is specified by 4996
         "/wd4996",
         // Enables the use of Intel Advanced Vector Extensions instructions. /arch:AVX2 and /arch:AVX512 are not recognizable for msvc 16.00
         "/arch:AVX",
         // Full compiler support for the Standard C++ exception handling model that safely unwinds stack objects requires /EHsc (recommended), /EHs, or /EHa.
         "/EHsc",
         // Set output file name
         "/Fea.exe",
         // Use all files in current folder as input
         "*${fileExtname}",
         // Link additional libs
         "kernel32.lib",
         "user32.lib",
         "gdi32.lib",
         "winspool.lib",
         "comdlg32.lib",
         "advapi32.lib",
         "shell32.lib",
         "ole32.lib",
         "oleaut32.lib",
         "uuid.lib",
         "odbc32.lib",
         "odbccp32.lib"
       ],
       "problemMatcher": [
         "$msCompile"
       ],
       "group": {
         "kind": "build",
         "isDefault": true
       }
     }
      ]
    }
    

Clang

下载这个。安装。

安装时记得勾选Add LLVM to the system path for current user。安装完成之后重启。

Checkpoint

你可以打开控制台窗口,尝试输入clang -v并回车,你应该可以看到clang version 11.0.0

使用

好的,现在你可以使用VS Code来编写代码,用Clang进行代码检查,用Visual Studio提供的编译器和调试器来进行编译和调试——全程不需要离开VS Code。 是时候和难用的Visual Studio 2010再见吧。VS Code会成为你学习C的好帮手,我相信。

你需要首先打开Visual Studio 命令提示(2010),然后敲code并回车来打开VS Code。 默认情况下VS Code会打开上次你没关闭的文件夹,或许就是你的code文件夹。

code文件夹里建立很多的子文件夹,在后者之内再建立很多的子文件夹——一个程序的所有代码放在一个文件夹里,不同的文件夹放不同的程序的代码比较合适。 这取代了在Visual Studio里建立工程的过程——我认为对初学者没有必要引入更多使人头痛的概念。

当你编程时,有时编辑框里会给出波浪线来警告你,得益于Clang,我们可以给出更好和更多的警告。

当你认为一切顺利,按ctrl + shift + B来编译你的代码。它会运行我在前面配置好的一个task,它会编译当前打开的文件所在的文件夹下的所有和当前打开的文件有相同扩展名的文件。默认生成的可执行文件的名字是a.exe

如果你需要调试程序,按F5就好,你可以在弹出的控制台窗口里观察输入和输出,按F10来单步调试。或者你可以在行号的左边单击来设置断点,按F5来执行到下一个断点。

如果你对Visual Studio的运行时检查记忆犹新的话,它可以在调试控制台里被找到,只不过在这里,运行时错误不会导致程序停止运行。

  1. 据我所知,编译器和调试器的关联相当紧密。一般选择了一个编译器,调试器也就被确定了。