前提
- 安装 Visual Studio Code
- VSCode 中安装 C/C++扩展
- 确保 Clang 已经安装(在终端中输入命令:
clang --version
来确认是否安装) - 未安装,在命令行执行xcode-select --install 命令,会自行安装,安装文件有点大
创建你的第一个 HelloWorld 程序
创建工作区(WorkSpace)
打开 VSCode, 创建一个 project 文件夹。
现在,project 就是我们的工作区(WorkSpace)了。当我们继续做完本教程的配置,这个工作区中将出现一个子文件夹.vscode,包含三个文件。
● tasks.json(编译选项设置)
创建 HelloWorld 的源代码文件
在 project 文件夹下创建一个 hello.cpp 文件
在 hello.cpp中粘贴以下内容
#include <iostream>
using namespace std;
int main(){
cout << "Hello World" << endl;
}
Command+S(⌘S)保存该文件,
运行 HelloWorld(compile and run)
注意:C++扩展是使用机器上已安装的 C++编译器来生成程序,所以在运行/调试 hello.cpp 前,请确保你已经符合了文章开头的前提,安装好了 C++编译器。
打开 hello.cpp,这将它将成为 active file,可以被用于生成和调试
点击图中右上角的按钮,选择 Run C/C++ File
在跳出的选项中,选择C/C++: clang++ build and debug active file。
只有在第一次运行 hello.cpp 时才需要做这个选择。选择后,.vscode 文件夹中出现了一个新文件tasks.json,我们选择的编译器配置将作为默认设置。
编译成功后,程序的输出将显示在下方的 DEBUG CONSOLE
至此,我们已经成功地运行了 VS Code 上的第一个 C++程序!
几大主流 C++ 编译器(ICC / GCC / Clang / VC++)
gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 编译器。gcc 是 GNU 亲儿子,Ubuntu 等常用发行版标配。clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是 Mac(XCode) 的默认编译器,微软等大公司都在往上靠,前景一片光明。知乎上对几个主流编译器的评价:
在标准支持方面,clang > g++ > vc > icc。从实际使用来看,非常取决于平台。比如win上vc最好,osx上clang最好,等。其他特点还有icc编译出来的东西在intel cpu上快。
clang/g++需要注意的是,他们的编译器对标准支持很好,但库的支持严重不行。以至于如果你要C++11/C++14,还是会打折扣的。另外,clang在win上简直是没有见过更屎的。
对于vc来说,编译速度这几代在一直提高,内存占用从vc12开始有明显改进,最明显的是Variadic template。还有内置的代码静态分析,在实际中很有用。vc14的静态分析不在每次载入一个ie(对,以前每分析一个.cpp,就载入一次ie!),速度快了相当多。
对我自己而言,优先级是clang>g++>msvc。
注:GNU是一个操作系统,其内容软件完全以GPL方式发布。这个操作系统是GNU计划的主要目标,名称来自GNU's Not Unix!的递归缩写,因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。GNU的创始人,理查德·马修·斯托曼,将GNU视为“达成社会目的技术方法”。
修改 tasks.json
修改了文件组织形式后,存储了编译配置的 tasks.json 也需要做对应修改。
第一次编译运行 hello.cpp 时,我的机器上生成的 tasks.json
如下:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
我们做如下两个修改:
工程中往往需要一次性编译选定路径下的所有 cpp 文件。对应的,把"args"中的:"${file}"改为"${fileDirname}/*.cpp"
我们希望把编译出的文件统一放置在 target 文件夹下。对应的,把"args"中的"${fileDirname}/${fileBasenameNoExtension}"改为"${workspaceFolder}/target/${fileBasenameNoExtension}"
修改工程文件结构
增加三个子文件夹 include
、src
、target
,并把 hello.cpp 移动到 src 目录下。
然后我们做下测试,看看修改后的工作区可否正常编译运行 hello.cpp
验证配置的正确性
在 include 中创建 print.h,粘贴如下内容:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void printMessage(vector<string>& msg);
在 src 中创建 print.cpp,粘贴如下内容:
#include "../include/print.h"
void printMessage(vector<string> &msg)
{
for (int i = 0; i < msg.size(); i ++){
cout << msg[i] << " ";
}
}
修改 src 下的 hello.cpp,粘贴如下内容:
#include "../include/print.h"
int main(){
vector<string> msg;
msg.push_back("Hello"); msg.push_back("World");
printMessage(msg);
}
在 hello.cpp 中点击右上角的 run 按钮,可以看到也成功运行了(这说明我们实现了一次性编译多个 cpp 文件),而且目标文件生成到了 target 下。