现已推出!阅读 10 月份的新功能和修复。

编辑和导航 C++ 代码

本文概述了 C/C++ 扩展特有的代码编辑和导航功能。有关 Visual Studio Code 中一般编辑和导航的更多信息,请参阅 基本编辑代码导航

编辑 C++ 代码

C/C++ 扩展提供的源代码编辑功能是用于编辑、格式化和理解代码库的强大工具。

识别头文件

为了提供最佳的编辑体验,C++ 扩展需要知道在何处查找代码中引用的每个头文件。默认情况下,扩展会搜索当前源目录、其子目录和一些特定于平台的位置。如果找不到引用的头文件,则在 #include 指令下方显示红色波浪线。

若要指定其他包含目录,请执行以下操作:

  1. 选择没有引用的 #include 路径。
  2. 选择出现的灯泡,然后选择“编辑 "includePath" 设置”,这将打开 C/C++ 扩展的设置编辑器。
  3. 在“包含路径”部分,可以指定任何其他包含目录的路径。

Process of adding a new header to the include path

列出成员

键入成员访问符号 (.->) 时,编辑器会显示一个成员列表。键入更多字母时,列表会实时筛选。

List members

代码格式化

Visual Studio Code 的 C/C++ 扩展支持使用 clang-format 和 vc_format 对源代码进行格式化。这两种格式化选项都包含在扩展中,其中 clang-format 是默认选项。

可以使用“格式化文档”(⇧⌥F(Windows Shift+Alt+F,Linux Ctrl+Shift+I))格式化整个文件,或使用“格式化选择”(⌘K ⌘F(Windows,Linux Ctrl+K Ctrl+F))格式化当前选择内容。还可以通过以下 设置,根据用户手势(如键入、保存和粘贴)触发格式化。

  • editor.formatOnSave - 在保存文件时进行格式化。
  • editor.formatOnType - 在键入时进行格式化(在 ; 字符处触发)。

若要详细了解格式化,请参阅 格式化

Clang-format

默认情况下,clang-format 样式设置为 file。这意味着如果在工作区中找到 .clang-format 文件,则文件中指定的设置将用作格式化参考。否则,格式化将基于 C_Cpp.clang_format_fallbackStyle 设置 中指定的默认样式。

目前,默认格式化样式为 Visual Studio,它近似于 Visual Studio 中的默认代码格式化程序。它暗示了以下设置。

UseTab: (VS Code current setting)
IndentWidth: (VS Code current setting)
BreakBeforeBraces: Allman
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
ColumnLimit: 0

若要使用与扩展附带的 clang-format 版本不同的版本,请将 C_Cpp.clang_format_path 设置 更改为安装 clang-format 二进制文件的路径。

例如,在 Windows 平台上,请使用

  "C_Cpp.clang_format_path": "C:\\Program Files (x86)\\LLVM\\bin\\clang-format.exe"

vc_format

默认情况下,如果在要格式化的代码附近标识了具有相关设置的 .editorconfig 文件,则会使用 Visual C++ 格式化引擎,而不是 clang-format。否则,请导航到 C_Cpp.formatting 设置 并将其设置为 vc_format,以使用 Visual C++ 格式化引擎。

增强的语义颜色化

启用 IntelliSense 时,Visual Studio Code C/C++ 扩展支持语义颜色化。有关设置类、函数、变量等的颜色的更多信息,请参阅 增强颜色化。有关配置 IntelliSense 的更多信息,请参阅 IntelliSense 配置

快速信息

可以将鼠标悬停在某个符号上,以查看其定义的内联视图。

Quick info

Doxygen 注释

Doxygen 是一种从源代码生成文档的工具。使用注释对代码进行注释后,Doxygen 就会为这些函数生成文档。对于 doxygen 注释,请键入 /** 并按 Enter 生成 doxygen 注释块。支持的 doxygen 标签包括:@brief@tparam@param@return@exception@deprecated@note@attention@pre

Markdown 注释

默认情况下,C++ 扩展支持在编辑器中显示 Markdown 的子集。此子集支持除符号 _* 之外的所有 Markdown 注释。切换新的“注释中的 Markdown”设置,可以启用所有 Markdown、保留此 Markdown 子集或禁用 Markdown 支持。

导航源代码

源代码导航功能可以帮助更好地理解代码库。这些功能允许快速搜索代码中的符号,导航到其定义或查找对其的引用。

导航由存储在符号信息本地数据库中的一组标签提供支持。每当打开包含 C++ 源代码文件的文件夹时,C/C++ 扩展都会创建这些文件中定义的符号的数据库。每当更改文件时,都会更新此数据库。如果关闭文档而不保存,则数据库会更新到最后保存的状态。

搜索符号

可以在当前文件或工作区中搜索符号,以更快地导航代码。

若要在当前文件中搜索符号,请按 ⇧⌘O(Windows,Linux Ctrl+Shift+O))并键入要查找的符号的名称。会出现一个可能的匹配项列表,该列表会随着键入进行筛选。从匹配项列表中选择一个项,导航到该符号所在的位置。

Searching the current file

若要在当前工作区中搜索符号,请按 ⌘T(Windows,Linux Ctrl+T))并键入符号的名称。会出现一个可能的匹配项列表。如果选择的匹配项位于尚未打开的文件中,则该文件将在导航到匹配项所在的位置之前打开。

Searching in your workspace

也可以通过“命令面板”(⇧⌘P(Windows,Linux Ctrl+Shift+P))搜索符号。使用“快速打开”(⌘P(Windows,Linux Ctrl+P))并键入 @ 命令以搜索当前文件,或键入 # 命令以搜索当前工作区。 ⇧⌘O(Windows,Linux Ctrl+Shift+O))和 ⌘T(Windows,Linux Ctrl+T))是 @# 命令的快捷方式。

调用层次结构

调用层次结构视图显示对某个函数的所有调用或从该函数的所有调用。它允许了解源代码中函数之间复杂的调用关系。

要查看调用层次结构,请选择一个函数,右键单击以显示上下文菜单,然后选择**显示调用层次结构**。您也可以使用键盘快捷键 (Windows 上为 `Shift+Alt+H`),或者调用**命令面板** (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并运行命令**调用:显示调用层次结构**。这将在侧边栏中填充调用树,其中包含您所选函数调用的所有函数。

Selecting call hierarchy and showing calls in sidebar

切换侧边栏菜单中的电话图标以切换到传入调用。当您的函数被另一个函数引用时,将显示传入调用。您还可以通过选择调用树中已显示的函数并在该函数上右键单击以查看可用命令来探索嵌套调用。

Nested Calls for Call Hierarchy

窥视

窥视功能在**窥视窗口**中显示几行代码,这样您就不必离开当前位置。它对于快速理解符号的上下文非常有用,而无需离开当前代码。

要打开**窥视窗口**,请通过右键单击导航到上下文菜单,然后选择**窥视**。在那里,您可以选择窥视符号的定义、声明、类型定义或引用。

Peek definition

在窥视窗口打开后,您可以浏览显示的结果列表以找到您感兴趣的结果。如果您想导航到其中一个结果的位置,请选择结果或双击窥视窗口左侧显示的源代码。

转到定义

使用**转到定义**功能可以快速导航到符号在源代码中的定义位置。在源代码中选择一个符号,然后按 F12,或者右键单击并从上下文菜单中选择**转到定义**。当符号只有一个定义时,您将直接导航到其位置,否则竞争定义将显示在窥视窗口中,如上一节所述。

如果找不到您所选符号的任何定义,C/C++ 扩展程序会自动搜索符号的声明。

转到声明

使用**转到声明**功能可以导航到符号在源代码中的声明位置。此功能与**转到定义**功能相同,但适用于声明。在源代码中选择一个符号,右键单击,然后从上下文菜单中选择**转到声明**。这将带您导航到符号声明的位置。

转到引用

使用**转到引用**功能可以了解符号在源代码中被引用的频率和位置。在源代码中选择一个符号,按 ⇧F12 (Windows, Linux Shift+F12) 或右键单击并从上下文菜单中选择**转到引用**。如果找到任何引用,它们将显示在窥视窗口中。

转到类型定义

使用**转到类型定义**功能可以跳转到类型在源代码中的定义位置。在源代码中选择一个类型,右键单击以打开上下文菜单,然后选择**转到类型定义**。

后续步骤

继续阅读以了解

如果您有任何其他问题或遇到任何问题,请在 GitHub 上提交问题。您可能会被要求提供扩展程序的日志信息以帮助诊断问题。请参阅 C/C++ 扩展程序日志记录 以获取有关提供扩展程序日志的帮助。