平时习惯了在Linux环境写C++,有时候切换到Windows想继续在同一个项目上工作,重新配置环境总是很麻烦。虽然Windows下用Visual Studio写C++只需要双击个图标,但我还是想折腾一下VS Code的环境配置。原因主要有两点:一是个人习惯上各种语言都在VS Code里面写,利用Git同步代码可以很方便地在不同平台开发同一个项目;二是有些情形下无法使用图形化界面,比如为Git配置CI(持续性集成)时显然不能用Visual Studio这个图形化的IDE来执行Windows环境的测试。
本文涉及的环境和工具版本:
Windows 10 VS Code 1.45.0 C/C++(ms-vscode.cpptools)插件0.28.0.insider3 CMake(twxs.cmake)插件0.0.17 CMake Tools(ms-vscode.cmake-tools)插件1.3.1 Visual Studio IntelliCode(visualstudioexptteam.vscodeintellicode)插件1.2.7 Visual Studio Community 2019 (需要调用VS提供的MSVC编译工具,以及相应的头文件和库文件) CMake 3.17.2 Ninja 1.10.0 Boost 1.73.0主要内容
1 创建C++项目
2 安装Visual Studio
3 安装CMake和Ninja
4 下载和编译Boost
4.1 Command Prompt的使用
4.2 编译Boost
5 命令行编译和测试
6 配置VS Code
6.1 settings.json
6.2 c_cpp_properties.json
6.3 tasks.json
6.4 launch.json
6.5 CMakeLists.txt
6.6 编译、测试和调试
创建C++项目
VSCode及插件的安装过程本文暂不介绍,这里直接给出项目的文件结构和代码。
项目结构如下。 .vscode 文件夹里面的3个json文件用来配置VS Code,第二个文件夹里面包含对LeetCode某一个问题的解答( solution.hpp 和 solution.cpp ), solution_test.cpp 用来执行单元测试。最下面的 CMakeLists.txt 文件用来配置CMake,给出项目的编译规则。

这里先给出C++部分的代码,其他文件的内容会在后面给出。
solution.hpp
#ifndef SOLUTION_HEADER
#define SOLUTION_HEADER
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2);
};
#endif
solution.cpp
#include "solution.hpp"
static auto x = []() {
// turn off sync
std::ios::sync_with_stdio(false);
// untie in/out streams
cin.tie(NULL);
return 0;
}();
vector<int> Solution::intersection(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size())
swap(nums1, nums2);
unordered_set<int> A(nums1.begin(), nums1.end()), C;
for (auto& i : nums2) {
if (A.find(i) != A.end())
C.insert(i);
}
return vector<int>(C.begin(), C.end());
}
solution.cpp
#include "solution.hpp"
static auto x = []() {
// turn off sync
std::ios::sync_with_stdio(false);
// untie in/out streams
cin.tie(NULL);
return 0;
}();
vector<int> Solution::intersection(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size())
swap(nums1, nums2);
unordered_set<int> A(nums1.begin(), nums1.end()), C;
for (auto& i : nums2) {
if (A.find(i) != A.end())
C.insert(i);
}
return vector<int>(C.begin(), C.end());
}










