嵌入式C编码规范

 

/*****************************************************************************
 函 数 名  : XXXXXXXXXXXX
 功能描述  : 事件执行函数
 输入参数  : void *parameter
 输出参数  : 无
 返 回 值  :
*****************************************************************************/

 

一般规则

这里列出了最明显和最重要的一般规则。在你继续阅读其他章节之前,请仔细检查它们。

  • 使用C99标准

  • 不使用制表符,而是使用空格

  • 每个缩进级别使用4个空格

  • 在关键字和左括号之间使用一个空格

  • 在函数名和左括号之间不要使用空格

  • 不要在变量/函数/宏/类型中使用__或_前缀。这是为C语言本身保留的

  • 对于严格的模块私有函数,使用prv_ name前缀

  • 对于包含下划线_ char的变量/函数/宏/类型,只能使用小写字母

  • 左花括号总是与关键字(for, while, do, switch, if,…)在同一行

  • 在比较操作符和赋值操作符之前和之后使用单个空格

  • 每个逗号后用单空格

  • 不要初始化静态和全局变量为0(或NULL),让编译器为您做

  • 在同一行中声明所有相同类型的局部变量

  • 按顺序声明局部变量

  • i.自定义结构和枚举

    ii.整数类型,更宽的无符号类型优先

    iii.单/双浮点

  •  

    避免在声明中使用函数调用来赋值变量,除了单个变量

  • 除了char、float或double之外,始终使用stdint.h标准库中声明的类型。例如,8位的uint8_t等

  • 不要使用stdbool.h库。分别使用1或0表示真或假

  • 永远不要与真实相比较。例如,使用if(check_func()){…}替换if (check_func() == 1)

  • 总是将指针与空值进行比较

  • 总是使用括号和sizeof操作符

  • 不要使用变长数组。使用动态内存分配代替标准C malloc和自由函数,或者如果库/项目提供了自定义内存分配,使用它的实现

  • 对于注释,总是使用/* comment */,即使是单行注释

  • 在头文件中总是包含带有extern关键字的c++检查

  • 每个函数都必须包含doxygen-enabled注释,即使函数是静态的

  • 使用英文名称/文本的函数,变量,注释

  • 变量使用小写字母

  • 如果变量包含多个名称,请使用下划线。force_redraw。不要使用forceRedraw

  • 对于C标准库的包含文件,请始终使用<和>。例如,# include < stdlib.h >

  • 对于自定义库,请始终使用""。例如,# include“my_library.h”

  • 当转换为指针类型时,总是将星号与类型对齐,例如。uint8_t* t = (uint8_t*)var_width_diff_type

  • 始终尊重项目或库中已经使用的代码风格

注释

  • 不允许以//开头的注释。总是使用/* comment */,即使是单行注释
//This is comment (wrong)
/* This is comment (ok) */
  • 对于多行注释,每行使用空格+星号

/*
 * This is multi-line comments,
 * written in 2 lines (ok)
 */
  • 注释时使用12个缩进(12 * 4个空格)偏移量。如果语句大于12个缩进,将注释4-空格对齐(下面的例子)到下一个可用缩进

函数

  • 每个可以从模块外部访问的函数都必须包含函数原型(或声明)

  • 函数名必须小写,可以用下划线_分隔

/* OK */
void my_func(void);
void myfunc(void);

/* Wrong */
void MYFunc(void);
void myFunc();
  • 当函数返回指针时,将星号对齐到返回类型

/* OK */
const char* my_func(void);
my_struct_t* my_func(int32_t a, int32_t b);

/* Wrong */
const char *my_func(void);
my_struct_t * my_func(void);
  • 齐所有的功能原型(使用相同/相似的功能)以提高可读性

/* OK, function names aligned */
void        set(int32_t a);
my_type_t   get(void);
my_ptr_t*   get_ptr(void);

/* Wrong */
void set(int32_t a);
const char * get(void);

变量

  • 使变量名全部小写,下划线_字符可选

/* OK */
int32_t a;
int32_t my_var;
int32_t myvar;

/* Wrong */
int32_t A;
int32_t myVar;
int32_t MYVar;
  • 按类型将局部变量分组在一起

void
foo(void) {
    int32_t a, b;   /* OK */
    char a;
    char b;         /* Wrong, char type already exists */
}
  • 不要在第一个可执行语句之后声明变量

void
foo(void) {
    int32_t a;
    a = bar();
    int32_t b;      /* Wrong, there is already executable statement */
}
  • 用星号声明指针变量与类型对齐

/* OK */
char* a;

/* Wrong */
char *a;
char * a;

结构、枚举类型定义

  • 结构名或枚举名必须小写,单词之间有下划线_字符

  • 结构或枚举可以包含typedef关键字

  • 所有结构成员都必须小写

  • 所有枚举成员必须是大写的

  • 结构/枚举必须遵循doxygen文档语法

在声明结构体时,它可以使用以下三种不同的选项之一:

1、当结构体仅用名称声明时,它的名称后不能包含_t后缀。

struct struct_name {
    char* a;
    char b;
};

2、当只使用typedef声明结构时,它的名称后面必须包含_t后缀。

typedef struct {
    char* a;
    char b;
} struct_name_t;

3、当结构用name和typedef声明时,它不能包含_t作为基本名称,它必须在它的名称后面包含_t后缀作为typedef部分。

typedef struct struct_name {
    char* a;
    char b;
    char c;
} struct_name_t;

错误声明的例子及其建议的纠正:

/* a and b must be separated to 2 lines */
/* Name of structure with typedef must include _t suffix */
typedef struct {
    int32_t a, b;
} a;

/* Corrected version */
typedef struct {
    int32_t a;
    int32_t b;
} a_t;

/* Wrong name, it must not include _t suffix */
struct name_t {
    int32_t a;
    int32_t b;
};

/* Wrong parameters, must be all uppercase */
typedef enum {
    MY_ENUM_TESTA,
    my_enum_testb,
} my_enum_t;
  • 在声明时初始化结构时,使用C99初始化风格

/* OK */
a_t a = {
    .a = 4,
    .b = 5,
};

/* Wrong */
a_t a = {1, 2};
  • 当为函数句柄引入new typedef时,使用_fn后缀

/* Function accepts 2 parameters and returns uint8_t */
/* Name of typedef has `_fn` suffix */
typedef uint8_t (*my_func_typedef_fn)(uint8_t p1, const char* p2);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值