VS Code 项目编译#
tasks.json编译配置文件#
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "clang",
"args": [
"${workspaceFolder}/src/*.c", // 编译src目录下所有.c文件
"-o", // 输出选项
"${workspaceFolder}/build/main", // 输出可执行文件到build目录
"-I${workspaceFolder}/include", // 包含头文件目录
"-Wall", // 开启所有警告
"-Wextra", // 开启所有警告
"-std=c11", // 使用c11标准
"-g" // 调试信息
],
"group": {
"kind": "build", // 定义为构建任务
"isDefault": true // 设置为build默认任务
},
"problemMatcher": ["$gcc"], // 编译错误匹配器
"detail": "compil all .c files in src"
}
]
}
"编译器自动识别main()函数并视为主文件,自动编译为一个可执行文件"
"每次编译仅能有一个main()函数,多个子任务可分别生成对应可执行文件"
"gcc与clang编译命令几乎可以互换,clang的problemMatcher刻意兼容gcc的"launch.json调试配置文件#
{
"configurations": [
{
"name": "(Windows) Launch", // 调试器名称
"type": "cppvsdbg", // 调试器类型
"request": "launch", // 启动类型
"program": "${workspaceFolder}/build/main", // 可执行文件
"args": [],
"stopAtEntry": false, // 是否在程序入口处暂停
"cwd": "${fileDirname}", // 设置工作目录为当前文件所在目录
"environment": [],
"console": "externalTerminal", // 控制台输出方式
"preLaunchTask": "build" // 预启动编译任务
}
]
} 规范项目目录#
├── build // 编译输出目录
├── include // .h目录
├── src // .c目录
├── tasks.json // 编译配置文件
├── launch.json // 调试配置文件
├── README.md
└── .gitignore头文件规范#
应该包含的内容:头文件保护、函数声明、变量声明(extern)、类型定义(typedef)、常量定义
不应该包含的内容:函数定义、变量定义、循环依赖、不必要头文件依赖
头文件保护:包含# ifndef FILENAME_H # define FILENAME_H # endif防止重复包含的宏定义
头文件与对应源文件# include标准 对比#
头文件:类型定义相关的库
源文件:函数实现相关的库、# include对应头文件(规范)
头文件对应源文件与main()文件# include头文件主要内容 对比#
对应源文件:头文件中的宏、类型定义等
main()文件:头文件中的函数声明、变量声明等
注:置于include目录下,编译器根据tasks.json中的-I${workspaceFolder}/include参数搜索头文件
头文件是模块的 API 文档,应该满足单一职责、最小化依赖、自包含性(包含所有必要依赖),并且只暴露必要的接口
源文件规范#
文件头部有正确的注释
包含顺序符合规范
命名空间使用得当
缩进和格式统一
函数长度适中
错误处理完善
注释清晰必要
无魔法数字
内存管理安全
线程安全考虑
注:源文件是模块的实现,应该满足可读性、可维护性、可扩展性、可测试性
预处理器指令#
#define 定义宏(符号常量或函数式宏)
#undef 取消已定义的宏
#include
#ifdef
#ifndef
#if
#else
#elif
#error 宏#if内,产生编译错误消息(例,#error "需要C99标准")
#endif