首页 菁菁校园 正文

回复

有人总结嵌入式C编码规范吗?

菁菁校园 浏览:594 回复:2 收藏

cdfarsight  2023-07-13 15:56

一般规则

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

  • 使用C99标准

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

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

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

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

int32_t a = sum(4, 3);              /* OK */
int32_t a = sum (4, 3);             /* Wrong */

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

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

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

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

size_t i;
for (i = 0; i < 5; ++i) {           /* OK */
}
for (i = 0; i < 5; ++i){            /* Wrong */
}
for (i = 0; i < 5; ++i)             /* Wrong */
{
}

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

// 微信公众号:嵌入式大杂烩
int32_t a;
a = 3 + 4;              /* OK */
for (a = 0; a < 5; ++a) /* OK */
a=3+4;                  /* Wrong */
a = 3+4;                /* Wrong */
for (a=0;a<5;++a)       /* Wrong */

  • 每个逗号后用单空格

// 微信公众号:嵌入式大杂烩
func_name(5, 4);        /* OK */
func_name(4,3);         /* Wrong */

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

static int32_t a;       /* OK */
static int32_t b = 4;   /* OK */
static int32_t a = 0;   /* Wrong */

void
my_func(void) {
    static int32_t* ptr;/* OK */
    static char abc = 0;/* Wrong */
}

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

void
my_func(void) {
    char a;             /* OK */
    char b;             /* Wrong, variable with char type already exists */
    char a, b;          /* OK */
}

  • 按顺序声明局部变量

i.自定义结构和枚举

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

iii.单/双浮点

int
my_func(void) {
    /* 1 */
    my_struct_t my;     /* First custom structures */
    my_struct_ptr_t* p; /* Pointers too */

    /* 2 */
    uint32_t a;
    int32_t b;
    uint16_t c;
    int16_t g;
    char h;
    /* ... */

    /* 3 */
    double d;
    float f;
}

  • 总是在块的开头声明局部变量,在第一个可执行语句之前

  • 在for循环中声明计数器变量

/* OK */
for (size_t i = 0; i < 10; ++i)

/* OK, if you need counter variable later */
size_t i;
for (i = 0; i < 10; ++i) {
    if (...) {
        break;
    }
}
if (i == 10) {

}

/* Wrong */
size_t i;
for (i = 0; i < 10; ++i) ...

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

void
a(void) {
    /* Avoid function calls when declaring variable */
    int32_t a, b = sum(1, 2);

    /* Use this */
    int32_t a, b;
    b = sum(1, 2);

    /* This is ok */
    uint8_t a = 3, b = 4;
}

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

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

/* OK */
uint8_t status;
status = 0;

/* Wrong */
#include <stdbool.h>
bool status = true;

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

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

void* ptr;

/* ... */

/* OK, compare against NULL */
if (ptr == NULL || ptr != NULL) {

}

/* Wrong */
if (ptr || !ptr) {

}

  • 总是使用前增量(和递减),而不是后增量(和递减)

int32_t a = 0;
...

a++;            /* Wrong */
++a;            /* OK */

for (size_t j = 0; j < 10; ++j) {}  /* OK */

  • 总是使用size_t作为长度或大小变量

  • 如果函数不应该修改指针所指向的内存,则总是使用const作为指针

  • 如果不应该修改函数的形参或变量,则总是使用const


我知道了