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