返回

MISRA C:2012 笔记

目录

一、命名总体要求

  • Rule 5.1:标识符长度 ≤ 31 个字符(前 31 字符内必须唯一)
  • Rule 5.2:同一作用域中,名称不得仅以大小写区分
  • Rule 5.3:不同作用域的相似名称应避免混淆
  • Rule 5.4:宏名不能与变量、函数或类型名冲突
  • Rule 5.5:外部标识符(全局)在整个工程中必须唯一
  • Rule 5.6:禁止使用与标准库同名的标识符
  • Rule 5.7:命名应反映作用域(如 g_, s_ 前缀)
  • Directive 4.1:全项目需使用一致的命名约定

二、命名风格总览

类型 前缀 风格 示例 说明
宏常量 无或模块前缀 全大写 + 下划线 MAX_TEMP, MOTOR_SPEED_LIMIT 一眼识别为常量
全局变量 g_ 小写 + 下划线 g_sensor_value 作用域:全局
文件内静态变量 s_ 小写 + 下划线 s_error_count 作用域:文件内
局部变量 小写 + 下划线 temp_value, index_count 作用域:函数内
函数名 模块前缀 + 动词_名词 小写 + 下划线 sensor_read_data() 命名体现行为
类型(typedef) 模块前缀 + 首字母大写 + _t 后缀 PascalCase + _t SensorData_t, MotorState_t 便于识别自定义类型
枚举成员 模块前缀 + 全大写 全大写 + 下划线 SENSOR_OK, SENSOR_ERROR 避免跨模块冲突

三、命名规范示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdint.h>

/* -------------------------------
 * Rule 5.1, 5.2: 唯一且不混淆命名
 * Rule 5.7: 前缀反映作用域
 * ------------------------------- */

/* 宏定义:全大写 + 下划线 */
#define MAX_TEMP_VALUE      (100U)    /* Rule 5.4: 宏名不得与变量重名 */
#define SENSOR_COUNT        (4U)

/* 类型定义:模块前缀 + PascalCase + _t 后缀 */
typedef struct
{
    uint16_t temperature;
    uint16_t voltage;
} SensorData_t;

/* 枚举:全大写 + 模块前缀 */
typedef enum
{
    SENSOR_OK,
    SENSOR_ERROR
} SensorStatus_t;

/* 全局变量:g_ 前缀 */
SensorData_t g_sensorData;        /* 全局传感器数据 */
uint8_t      g_systemMode;        /* 系统模式标志 */

/* 文件内静态变量:s_ 前缀 */
static uint16_t s_errorCount = 0U;

/* 函数命名:模块前缀 + 动词_名词 */
void Sensor_Init(void);            /* 初始化传感器 */
SensorStatus_t Sensor_ReadData(SensorData_t* data); /* 读取传感器数据 */

/* -------------------------------
 * Rule 5.3: 避免相似名称混淆
 * Rule 15.6: 所有控制语句应使用 {}
 * ------------------------------- */

void Sensor_Init(void)
{
    g_sensorData.temperature = 0U;
    g_sensorData.voltage     = 0U;
    s_errorCount = 0U;
}

/* 函数参数使用小写下划线命名 */
SensorStatus_t Sensor_ReadData(SensorData_t* sensor_data)
{
    if (sensor_data == NULL)
    {
        s_errorCount++;
        return SENSOR_ERROR;
    }

    sensor_data->temperature = 25U;
    sensor_data->voltage     = 3300U;
    return SENSOR_OK;
}

四、命名规范检查清单(Checklist)

  • 所有标识符长度 ≤ 31 个字符(Rule 5.1)
  • 不存在仅大小写不同的标识符(Rule 5.2)
  • 不存在跨作用域的相似命名(Rule 5.3)
  • 宏名与其他标识符无重名(Rule 5.4)
  • 所有全局标识符在项目中唯一(Rule 5.5)
  • 不与标准库符号冲突(Rule 5.6)
  • 前缀区分作用域(Rule 5.7)
  • 全项目命名风格一致(Directive 4.1)

五、命名风格推荐

推荐使用 小写 + 下划线(snake_case) 为主风格, 结合前缀区分作用域与类型,命名应反映语义。

例如:

1
2
3
4
/* 模块名:Motor */
void Motor_Start(void);
void Motor_Stop(void);
MotorState_t Motor_GetState(void);

六、总结

MISRA C 不强制具体命名风格,但要求:

  1. 唯一、无歧义、可读;
  2. 作用域区分明显;
  3. 全项目一致;
  4. 宏、类型、变量、函数命名规则清晰。

遵守以上规范有助于:

  • 降低审查警告;
  • 减少命名冲突;
  • 提高团队协作与代码可维护性。
Licensed under CC BY-NC-SA 4.0