intmain() {return0;}
或者:
for (inti=0; i<n; ++i) {}
再比如 CMake 项目中经常写:
target_include_directories(app PRIVATE${CMAKE_CURRENT_SOURCE_DIR}/include)
这些代码本身不难,但重复输入会浪费时间,也容易因为手误产生小问题。
这时候,Snippets 就派上用场了。
本文主要结合 Linux + VS Code + C++/CMake 开发环境,介绍 Snippets 的基本用法。内容分为六部分:
Snippets 是什么?
Snippets 有什么作用?
Snippets 怎么用?
使用 Snippets 时的常见问题
总结
Snippets,中文通常叫做代码片段。
简单来说,它是一种“代码模板自动展开”功能。
你可以提前定义一段常用代码,并给它设置一个简短的触发词。以后写代码时,只需要输入这个触发词,再按 Tab 或 Enter,VS Code 就会自动帮你展开成完整代码。
例如,我们定义一个 C++ 的 main 函数代码片段:
{"C++ Main": {"prefix": "maincpp","body": ["#include <iostream>","","int main() {"," $0"," return 0;","}" ],"description": "C++ main 函数" }}
以后在 .cpp 文件中输入:
maincpp按下 Tab,就会自动生成:
#include <iostream>intmain() {return0;}
其中,$0 表示代码展开后,光标最终停留的位置。
Snippets 的核心作用就是:
减少重复输入,提高编码效率,统一代码风格。
对于机器人开发、C++ 项目开发、算法验证、ROS 工程、CMake 项目管理等场景,Snippets 都非常实用。
在 C++ 开发中,我们经常会写一些固定结构,例如:
main 函数
for 循环
class 类
struct 结构体
namespace
try-catch
std::cout
debug 输出语句
例如定义一个 for 循环 snippet:
{"For Loop": {"prefix": "fori","body": ["for (int ${1:i} = 0; ${1:i} < ${2:n}; ++${1:i}) {"," $0","}" ],"description": "普通 for 循环" }}
输入:
fori展开后:
for (inti=0; i<n; ++i) {}
这里的 ${1:i}、${2:n} 是占位符。展开后可以按 Tab 在不同占位符之间跳转。
比如 C++ 中常用的快速 IO:
std::ios::sync_with_stdio(false);std::cin.tie(nullptr);
可以配置成:
{"Fast IO": {"prefix": "fio","body": ["std::ios::sync_with_stdio(false);","std::cin.tie(nullptr);" ],"description": "C++ 快速 IO" }}
以后只需要输入:
fio就能快速生成这两行代码。
在项目开发中,一些代码结构最好保持统一,比如:
类定义格式
头文件保护格式
日志输出格式
单元测试模板
CMake 目标定义方式
例如 C++ 类模板:
{"Class": {"prefix": "class","body": ["class ${1:ClassName} {","public:"," ${1:ClassName}() = default;"," ~${1:ClassName}() = default;","","private:"," $0","};" ],"description": "C++ class 模板" }}
展开后:
classClassName {public:ClassName() =default;~ClassName() =default;private:};
这样可以让项目代码更加规范。
机器人相关开发经常会涉及 CMake,例如 ROS、ROS 2、传感器驱动、运动控制库、算法模块等都离不开 CMake。
Snippets 可以帮助我们快速生成 CMake 常用配置。
例如:
{"CMake Minimal C++ Project": {"prefix": "cmakemin","body": ["cmake_minimum_required(VERSION ${1:3.16})","","project(${2:MyProject} LANGUAGES CXX)","","set(CMAKE_CXX_STANDARD ${3:17})","set(CMAKE_CXX_STANDARD_REQUIRED ON)","set(CMAKE_EXPORT_COMPILE_COMMANDS ON)","","add_executable(${4:app}"," src/main.cpp",")" ],"description": "最小 C++ CMake 项目模板" }}
在 CMakeLists.txt 中输入:
cmakemin即可生成基础 CMake 项目结构。
VS Code snippets 支持一些内置变量,例如:
| 变量 | 含义 |
|---|---|
$TM_FILENAME | 当前文件名 |
$TM_FILENAME_BASE | 不带扩展名的文件名 |
$CURRENT_YEAR | 当前年份 |
$CURRENT_MONTH | 当前月份 |
$CURRENT_DATE | 当前日期 |
$SELECTED_TEXT | 当前选中的文本 |
例如,根据当前文件名自动生成类名:
{"Class From File Name": {"prefix": "classfile","body": ["class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/} {","public:"," ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}() = default;"," ~${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}() = default;","","private:"," $0","};" ],"description": "根据文件名生成 PascalCase 类" }}
假设当前文件名是:
user_service.cpp展开后会生成:
classUserService {public:UserService() =default;~UserService() =default;private:};
这就是 snippet 中正则转换的典型应用。
下面以 VS Code 为例,介绍 Snippets 的实际配置方法。
在 VS Code 中按:
Ctrl + Shift + P打开命令面板,然后输入:
Configure User Snippets然后选择对应语言的 snippets 文件。
如果是 C++,选择:
cpp.json如果是 CMake,选择:
cmake.json如果想创建所有语言都能用的 snippets,可以选择:
New Global Snippets file...一个 snippet 通常由四部分组成:
{"Snippet Name": {"prefix": "trigger","body": ["code line 1","code line 2" ],"description": "description text" }}
字段含义如下:
| 字段 | 作用 |
|---|---|
Snippet Name | 代码片段名称 |
prefix | 触发词 |
body | 展开后的代码内容 |
description | 描述信息 |
例如:
{"Cout": {"prefix": "cout","body": ["std::cout << ${1:value} << '\\n';" ],"description": "std::cout 输出" }}
输入:
cout展开后:
std::cout<<value<<'\n';Snippets 中最常用的语法是占位符。
$1、$2、$3表示光标跳转顺序。
{"Function": {"prefix": "func","body": ["${1:void} ${2:functionName}(${3:params}) {"," $0","}" ],"description": "普通函数模板" }}
展开后:
voidfunctionName(params) {}
光标会依次跳转到:
void
functionName
params
函数体
$0表示最终光标停留位置。
{"If Statement": {"prefix": "if","body": ["if (${1:condition}) {"," $0","}" ],"description": "if 语句" }}
例如:
{"For Loop": {"prefix": "fori","body": ["for (int ${1:i} = 0; ${1:i} < ${2:n}; ++${1:i}) {"," $0","}" ],"description": "for 循环" }}
展开后:
for (inti=0; i<n; ++i) {}
如果把第一个 i 改成 j,后面的 i 也会同步变成 j。
Snippets 还支持选项选择。
语法如下:
${1|选项1,选项2,选项3|}例如 CMake 中经常用到 PRIVATE、PUBLIC、INTERFACE:
{"CMake Target Include Directories": {"prefix": "targetinc","body": ["target_include_directories(${1:target}"," ${2|PRIVATE,PUBLIC,INTERFACE|}"," ${3:${CMAKE_CURRENT_SOURCE_DIR}/include}",")" ],"description": "给目标添加 include 目录" }}
展开时可以选择:
PRIVATE或者:
PUBLIC或者:
INTERFACEVS Code snippets 支持内置变量。
例如文件头注释:
{"File Header": {"prefix": "header","body": ["/**"," * @file $TM_FILENAME"," * @brief ${1:Description}"," * @date $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE"," */","","$0" ],"description": "文件头注释" }}
假设当前文件名是 main.cpp,展开后可能得到:
/*** @file main.cpp* @brief Description* @date 2026-05-14*/
Snippet 中还可以使用正则表达式对变量或占位符进行转换。
基本语法是:
${变量/正则/替换内容/选项}例如,把当前文件名转换成大写:
{"Uppercase Filename": {"prefix": "upfile","body": ["${TM_FILENAME_BASE/(.*)/${1:/upcase}/}" ],"description": "文件名转大写" }}
如果当前文件是:
hello.cpp展开结果:
HELLO常见转换方式:
| 写法 | 作用 |
|---|---|
${1:/upcase} | 转大写 |
${1:/downcase} | 转小写 |
${1:/capitalize} | 首字母大写 |
${1:/camelcase} | 转 camelCase |
${1:/pascalcase} | 转 PascalCase |
下面是一组适合 C++ 日常开发的 snippets,可以放到 cpp.json 中。
{"C++ Main": {"prefix": "maincpp","body": ["#include <iostream>","","int main() {"," $0"," return 0;","}" ],"description": "C++ main 函数" },"C++ Main With Fast IO": {"prefix": "mainfast","body": ["#include <iostream>","","int main() {"," std::ios::sync_with_stdio(false);"," std::cin.tie(nullptr);",""," $0",""," return 0;","}" ],"description": "带快速 IO 的 C++ main 函数" },"Fast IO": {"prefix": "fio","body": ["std::ios::sync_with_stdio(false);","std::cin.tie(nullptr);" ],"description": "C++ 快速 IO" },"For Loop": {"prefix": "fori","body": ["for (int ${1:i} = 0; ${1:i} < ${2:n}; ++${1:i}) {"," $0","}" ],"description": "普通 for 循环" },"Range Based For Loop": {"prefix": "fore","body": ["for (const auto& ${1:item} : ${2:container}) {"," $0","}" ],"description": "范围 for 循环" },"Cout": {"prefix": "cout","body": ["std::cout << ${1:value} << '\\n';" ],"description": "std::cout 输出" },"Debug Print": {"prefix": "dbg","body": ["std::cerr << \"${1:var} = \" << ${1:var} << '\\n';" ],"description": "调试输出变量" },"Class": {"prefix": "class","body": ["class ${1:ClassName} {","public:"," ${1:ClassName}() = default;"," ~${1:ClassName}() = default;","","private:"," $0","};" ],"description": "C++ class 模板" },"Pragma Once": {"prefix": "once","body": ["#pragma once","","$0" ],"description": "头文件 pragma once" }}
下面是一组适合 CMakeLists.txt 的 snippets,可以放到 cmake.json 中。
{"CMake Minimal C++ Project": {"prefix": "cmakemin","body": ["cmake_minimum_required(VERSION ${1:3.16})","","project(${2:MyProject} LANGUAGES CXX)","","set(CMAKE_CXX_STANDARD ${3:17})","set(CMAKE_CXX_STANDARD_REQUIRED ON)","set(CMAKE_CXX_EXTENSIONS OFF)","set(CMAKE_EXPORT_COMPILE_COMMANDS ON)","","add_executable(${4:app}"," src/main.cpp",")" ],"description": "最小 C++ CMake 项目模板" },"CMake Add Executable": {"prefix": "addexe","body": ["add_executable(${1:app}"," ${2:src/main.cpp}",")" ],"description": "添加可执行文件目标" },"CMake Target Include Directories": {"prefix": "targetinc","body": ["target_include_directories(${1:target}"," ${2|PRIVATE,PUBLIC,INTERFACE|}"," ${3:${CMAKE_CURRENT_SOURCE_DIR}/include}",")" ],"description": "给目标添加 include 目录" },"CMake Target Link Libraries": {"prefix": "targetlink","body": ["target_link_libraries(${1:target}"," ${2|PRIVATE,PUBLIC,INTERFACE|}"," ${3:library}",")" ],"description": "给目标链接库" },"CMake Target Compile Options": {"prefix": "targetopts","body": ["target_compile_options(${1:target}"," PRIVATE"," -Wall"," -Wextra"," -Wpedantic",")" ],"description": "给目标添加编译选项" }}
可以检查以下几点:
VS Code 右下角应该显示当前语言类型,例如:
C++或者:
CMake如果语言模式不对,snippet 可能不会触发。
C++ snippets 应该放在:
cpp.jsonCMake snippets 应该放在:
cmake.jsonSnippet 配置是 JSON 格式,常见错误包括:
少写逗号
多写逗号
引号没有闭合
花括号没有配对
反斜杠没有正确转义
可以在 VS Code 设置中添加:
{"editor.tabCompletion": "on"}
也可以输入触发词后按:
Ctrl + Space手动调出补全菜单。
由于 snippets 写在 JSON 文件中,所以有些字符需要转义。
如果想生成:
std::cout<<"hello"<<'\n';在 snippet 中需要写成:
"std::cout << \"hello\" << '\\n';"如果想生成 C++ 里的 \n,可以写:
"std::cout << ${1:value} << '\\n';"或者:
"std::cout << ${1:value} << \"\\n\";"例如正则中的:
\d+在 JSON 字符串里要写成:
"\\d+"这是因为 JSON 本身也使用反斜杠作为转义字符。
Snippets 是一个非常轻量但实用的开发效率工具。
它的核心思想很简单:
把经常重复输入的代码结构,提前做成模板,需要时通过触发词快速展开。
对于 C++ 和机器人开发来说,Snippets 可以帮助我们快速生成:
C++ 基础代码结构
类、函数、循环、调试语句
CMake 项目配置
测试模板
文件头注释
根据文件名生成类名或宏定义
它并不会改变你的编程能力,但可以明显减少机械重复输入,让你把更多精力放在算法、架构和业务逻辑上。
如果你平时使用 Linux + VS Code 进行 C++、CMake、ROS 或机器人相关开发,非常推荐花一点时间配置一套自己的 snippets。配置一次,长期受益。