俗话说,无规矩不成方圆。
作为软件工程师,必须要遵守代码的书写格式。比如像Linux这么庞大的项目,如果没有统一风格,那么整个操作就像一坨屎一样;规定了独特的编码风格,也可以让读者更加清晰的去理解。
以前读书的时候,我那时候的写代码的想法就是只要功能实现,管它是什么代码风格。但是你会发现,回头来看自己写的代码,会发现这是什么鬼,究竟是什么意思?你可能连自己当初写的代码是什么意思都忘记。所以写代码遵守特定的风格,会让代码可读性更加好。代码编码风格很多(驼峰命名法,匈牙利命名法)下面我来说说Linux的编码风格:
❤1. 宏、变量、函数的命名:
宏:需要使用大写字母;
变量:通过下划线隔开每一个单词
函数:通过下划线隔开每一个单词
#define PI 3.1415926
int min_value, max_value;
void send_data(void);
❤2. 缩进采用“Tab”
❤3. “{”和“}”的使用原则
①结构体、if、for、while、switch;“{”不另起一行。
struct data {
int a;
char b[1];
};
if(a==b) {
c = a;
b = c;
}
②其中if、fort循环中只有一条执行语句,不需要加“{”和“}”。
for(i = 0; i<10; i++)
a=b;
③if和else混用情况,else无需另起一行。
if(a == b) {
c = a;
b = c;
} else {
b = c;
c = a;
}
④对于函数,“{”无需另起一行。
int func(int a, int b)
{
a = c;
b = d;
}
❤4. switch和case需要对齐。
switch(val) {
case ‘a’:
c = a;
break;
default:
b = a;
break;
}
❤5. 零长度和变量长度数组
①零长度
struct var_data {
int len;
char data[0];
};
data[0]仅仅意味着程序中通过val_data结构体实例的data[index]成员可以访问len之后的第index个地址,它并没有为data[]数组分配内存,因此sizeof(struct var_data) = sizeof(int)。
②变量长度数组
int main(int argc, char *argv[])
{
int len = argc;
char data[len];
return 0;
}
❤6. case的范围
switch (ch) {
case ‘0’…’9’:
a = 0;
break;
case ‘a’…’f’:
b=1;
break;
}
其中代码中的case ‘0’…’9’等价:
case ‘0’: case ‘1’: case ‘2’: case ‘3’: case ‘4’:
case ‘5’: case ‘6’: case ‘7’: case ‘8’: case ‘9’:
❤7. 语句表达式
包含在括号中的复合语句看成一个表达式,称为语句表达式,他可以出现在任何允许表达式的地方。
#define MIN_T(type, x, y) ({type __x = (x); type __y = (y); __x < __y? __x : __y;})
int a, b, min;
min = MIN_T(int, a, b);
其中,这里重新定义了__x和__y两个局部变量,所以定义的宏不会引起副作用。
❤8. typeof关键字
#define MIN_T(x, y) ({ \
const typeof(x) _x = (x); \
const typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y})
其中,跟第七点定义的MIN_T这个宏对比,少了type传入,通过typeof()获取类型。(void) (&_x == &_y);的作用是检查_x和_y的类型是否一致。
❤9. do{} while(0)语句
Linux中,do{}while(0)的用法主要用于宏定义。
#define FREE(p) do{ free(p); p=NULL; } while(0)
如果去掉do{} while(0),则宏定义FREE为:
#define FREE(p) free(p); p=NULL;
例子:
if(p != NULL)
FREE(p);
else
break;
代码展开:
if(p != NULL)
free(p); p=NULL;
else
break;
你会发现代码怪怪的,对的明显有问题
①if分支之后有两个语句,导致else分支没有对应的if,编译出错,
②如果没有else分支,也会出问题,FREE中的第二条语句无论if条件是否成立,都会被执行
❤10. goto语句
之前有人跟我说尽量不要使用goto,但是linux里却使用的频繁,主要使用在错误处理。
①保证在错误处理时注销、资源释放。
②与正常的注册、资源申请顺序相反
if(a != 0)
goto err;
if(b != 0)
goto err1;
err1:
retuen 0;
err:
return 0;
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!