在开始配置前,请确保你的系统已满足以下要求:
- 安装Visual Studio Code:从VS Code官网下载并安装最新版本
- 安装C++扩展:打开VS Code后,在扩展面板(⇧⌘X)中搜索"C++"并安装Microsoft官方的C/C++扩展
C/C++ extension
- 验证Clang安装:macOS通常预装了Clang编译器,可通过终端验证:
代码语言:bash
AI代码解释
clang --version
如果未安装Clang,终端会提示安装命令行开发者工具,或直接运行:
代码语言:bash
AI代码解释
xcode-select --install
创建Hello World项目
1. 初始化项目文件夹
打开终端,执行以下命令创建项目目录并在VS Code中打开:
代码语言:bash
AI代码解释
mkdir projects cd projects mkdir helloworld cd helloworld code .
code .
命令会在当前目录启动VS Code,该目录将作为你的工作区。
2. 创建源代码文件
在VS Code的文件资源管理器(⇧⌘E)中:
- 点击"新建文件"按钮
New File title bar button
- 命名为
helloworld.cpp
- 粘贴以下代码:
代码语言:cpp
代码运行次数:0
运行
AI代码解释
#include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"}; for (const string& word : msg) { cout << word << " "; } cout << endl; }
按⌘S保存文件。注意你的文件会显示在VS Code的文件资源管理器视图中:
File Explorer
建议启用自动保存功能(文件 > 自动保存)以避免丢失代码。
探索IntelliSense功能
IntelliSense是帮助你更快更高效编码的工具,提供代码补全、参数信息、快速信息和成员列表等功能。
要查看IntelliSense的实际效果,将鼠标悬停在vector
或string
上查看其类型信息。当你在第10行输入msg.
时,可以看到IntelliSense生成的推荐成员函数列表:
Statement completion IntelliSense
你可以按Tab键插入选中的成员。添加开括号时,会显示函数所需参数的信息。
如果IntelliSense尚未配置,打开命令面板(⇧⌘P)并输入"Select IntelliSense Configuration",从编译器下拉列表中选择Use clang++
进行配置。
运行helloworld.cpp
确保helloworld.cpp
是活动文件,点击编辑器右上角的播放按钮:
Screenshot of helloworld.cpp and play button
从系统检测到的编译器列表中选择"C/C++: clang++ build and debug active file":
C++ debug configuration dropdown
首次运行helloworld.cpp
时才会要求选择编译器,此编译器将作为tasks.json
文件中的"默认"编译器。
构建成功后,程序输出将显示在集成调试控制台中:
screenshot of program output
恭喜!你已在VS Code中成功运行第一个C++程序!
理解tasks.json
首次运行程序时,C++扩展会在项目的.vscode
文件夹中创建tasks.json
,用于存储构建配置。
macOS上的tasks.json
示例:
代码语言:json
AI代码解释
{ "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" }
关键设置说明:
command
: 指定要运行的程序(此处为clang++
)args
: 传递给clang++的命令行参数,按编译器期望的顺序指定label
: 任务列表中显示的名称,可根据个人偏好设置detail
: 任务列表中任务的描述,可更新以区分相似任务problemMatcher
: 用于在编译器输出中查找错误和警告的输出解析器
从现在开始,播放按钮将始终从tasks.json
读取构建和运行程序的方式。你可以在tasks.json
中定义多个构建任务,标记为默认的任务将被播放按钮使用。
调试helloworld.cpp
设置断点并开始调试
返回helloworld.cpp
使其成为活动文件,通过点击编辑器边距或在当前行使用F9设置断点:
screenshot of breakpoint in helloworld.cpp
从播放按钮旁边的下拉菜单中选择"Debug C/C++ File":
aly.h4cshop.com55
从系统检测到的编译器列表中选择"C/C++: clang++ build and debug active file"(首次运行或调试helloworld.cpp
时才会要求选择):
C++ debug configuration dropdown
你将看到任务执行并在终端窗口中打印输出:
Hello World Terminal Output
播放按钮有两种模式:"Run C/C++ File"和"Debug C/C++ File",默认为上次使用的模式。如果播放按钮上显示调试图标,可直接点击进行调试。
探索调试器
开始单步执行代码前,注意用户界面的几个变化:
- 集成终端出现在源代码编辑器底部,调试控制台选项卡显示调试器运行的输出
- 编辑器高亮显示开始调试前设置断点的行:
- 活动栏中的"运行和调试"视图显示调试信息
- 代码编辑器顶部出现调试控制面板,可通过抓住左侧的点在屏幕上移动:
aly.e5wa.com88
单步执行代码
现在准备开始单步执行代码:
选择调试控制面板中的"单步跳过"图标,使for (const string& word : msg)
语句高亮显示:
Step over button
"单步跳过"命令会跳过创建和初始化msg
变量时vector
和string
类中的所有内部函数调用。注意"变量"窗口中的变化,msg
的内容现在可见,因为该语句已完成。
再次按"单步跳过"前进到下一条语句(跳过初始化循环执行的所有内部代码),现在"变量"窗口显示循环变量的信息。
再次按"单步跳过"执行cout
语句。
如果愿意,可以继续按"单步跳过"直到向量中的所有单词都打印到控制台。如果好奇,可以按"单步进入"按钮单步执行C++标准库的源代码!
设置监视
你可能希望跟踪程序执行时变量的值,可以通过设置变量监视来实现。
在"监视"窗口中,选择加号并在文本框中输入word
(循环变量的名称)。单步执行循环时查看"监视"窗口:
Watch window
注意:只有当程序执行在变量的作用域内时,才能看到监视变量的值。例如,循环变量只有在程序执行循环时才可用。
你还可以在程序暂停时将鼠标悬停在任何变量上快速查看其值:
Mouse hover
使用launch.json自定义调试
使用播放按钮或F5调试时,C++扩展会动态创建调试配置。
在某些情况下,你可能需要自定义调试配置,例如指定运行时传递给程序的参数。你可以在launch.json
文件中定义自定义调试配置。
要创建launch.json
,从播放按钮下拉菜单中选择"Add Debug Configuration":
aly.extwinks.com77
Add debug configuration play button menu
然后会看到各种预定义调试配置的下拉列表,选择"C/C++: clang++ build and debug active file"。
VS Code会创建launch.json
文件,内容如下:
代码语言:json
AI代码解释
{ "configurations": [ { "name": "C/C++: clang++ build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "lldb", "preLaunchTask": "C/C++: clang++ build active file" } ], "version": "2.0.0" }
program
设置指定要调试的程序,此处设置为活动文件文件夹(${fileDirname}
)和活动文件名(${fileBasenameNoExtension}
),如果helloworld.cpp
是活动文件,则为helloworld
。args
属性是运行时传递给程序的参数数组。
默认情况下,C++扩展不会在源代码中添加任何断点,stopAtEntry
值设置为false
。将stopAtEntry
值更改为true
可使调试器在启动调试时在main
方法处停止。
确保preLaunchTask
值与tasks.json
文件中构建任务的label
匹配。
从现在开始,播放按钮和F5将在启动程序进行调试时读取launch.json
文件。
添加其他C/C++设置
要更全面地控制C/C++扩展,可以创建c_cpp_properties.json
文件,允许你更改编译器路径、包含路径、编译所用的C++标准(如C++17)等设置。
从命令面板(⇧⌘P)运行命令"C/C++: Edit Configurations (UI)",打开C/C++配置UI:
Command Palette
这将打开C/C++配置页面:
C++ configuration
Visual Studio Code将这些设置放在/.vscode/c_cpp_properties.json
中,直接打开该文件,内容如下:
代码语言:json
AI代码解释
{ "configurations": [ { "name": "Mac", "includePath": ["${workspaceFolder}/**"], "defines": [], "macFrameworkPath": [ "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "macos-clang-arm64" } ], "version": 4 }
只有当程序包含不在工作区或标准库路径中的头文件时,才需要修改"Include path"设置。
常见问题及解决方法
编译器和链接错误
最常见的错误(如undefined _main
或attempting to link with file built for unknown-unsupported file format
等)发生在启动构建或调试时helloworld.cpp
不是活动文件。这是因为编译器试图编译不是源代码的文件,如launch.json
、tasks.json
或c_cpp_properties.json
文件。
如果看到提及"C++11 extensions"的构建错误,可能是因为你没有更新tasks.json
构建任务以使用--std=c++17
的clang++参数。默认情况下,clang++使用C++98标准,不支持helloworld.cpp
中使用的初始化方式。确保用"运行helloworld.cpp"部分提供的代码块替换tasks.json
文件的全部内容。
终端无法启动输入
在macOS Catalina及更高版本上,即使设置了"externalConsole": true
,也可能无法输入内容。终端窗口会打开,但实际上不允许输入任何内容。
此问题目前在#5079中跟踪。
解决方法是让VS Code启动终端一次。你可以通过在tasks.json
中添加并运行以下任务来实现:
代码语言:json
AI代码解释
{ "label": "Open Terminal", "type": "shell", "command": "osascript -e 'tell application \"Terminal\" to do script \"echo hello\"'", "problemMatcher": [] }
通过"终端 > 运行任务..."并选择"Open Terminal"来运行此特定任务。
接受权限请求后,调试时应显示外部控制台。
后续步骤
- 探索VS Code用户指南
- 查看C++扩展概述
- 创建新工作区,复制.json文件,调整新工作区路径、程序名称等必要设置,开始编码!