一般规则
这里列出了最明显和最重要的一般规则。在你继续阅读其他章节之前,请仔细检查它们。
使用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