前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux 编程风格《Rice linux 学习开发》

linux 编程风格《Rice linux 学习开发》

作者头像
Rice加饭
发布2022-05-09 21:12:12
7890
发布2022-05-09 21:12:12
举报
文章被收录于专栏:Rice嵌入式Rice嵌入式

俗话说,无规矩不成方圆。

作为软件工程师,必须要遵守代码的书写格式。比如像Linux这么庞大的项目,如果没有统一风格,那么整个操作就像一坨屎一样;规定了独特的编码风格,也可以让读者更加清晰的去理解。

以前读书的时候,我那时候的写代码的想法就是只要功能实现,管它是什么代码风格。但是你会发现,回头来看自己写的代码,会发现这是什么鬼,究竟是什么意思?你可能连自己当初写的代码是什么意思都忘记。所以写代码遵守特定的风格,会让代码可读性更加好。代码编码风格很多(驼峰命名法,匈牙利命名法)下面我来说说Linux的编码风格:

❤1. 宏、变量、函数的命名:

宏:需要使用大写字母;

变量:通过下划线隔开每一个单词

函数:通过下划线隔开每一个单词

代码语言:javascript
复制
#define PI 3.1415926
int min_value, max_value;
void send_data(void);

❤2. 缩进采用“Tab”

❤3. “{”和“}”的使用原则

①结构体、if、for、while、switch;“{”不另起一行。

代码语言:javascript
复制
struct data {
  int a;
  char b[1]; 
};

if(a==b) {
  c = a;
  b = c;
}

②其中if、fort循环中只有一条执行语句,不需要加“{”和“}”。

代码语言:javascript
复制
for(i = 0; i<10; i++)
  a=b;

③if和else混用情况,else无需另起一行。

代码语言:javascript
复制
if(a == b) {
  c = a;
  b = c;
} else {
  b = c;
  c = a;
}

④对于函数,“{”无需另起一行。

代码语言:javascript
复制
int func(int a, int b)
{
  a = c;
  b = d;
}

❤4. switch和case需要对齐。

代码语言:javascript
复制
switch(val) {
case ‘a’:
  c = a;
  break;
default:
  b = a;
  break;
}

❤5. 零长度和变量长度数组

①零长度

代码语言:javascript
复制
struct var_data {
  int len;
  char data[0];
};

data[0]仅仅意味着程序中通过val_data结构体实例的data[index]成员可以访问len之后的第index个地址,它并没有为data[]数组分配内存,因此sizeof(struct var_data) = sizeof(int)。

②变量长度数组

代码语言:javascript
复制
int main(int argc, char *argv[])
{
  int len = argc;
  char data[len];

  return 0;
}

❤6. case的范围

代码语言:javascript
复制
switch (ch) {
case ‘0’…’9’:
  a = 0;
  break;
case ‘a’…’f’:
  b=1;
  break;
}

其中代码中的case ‘0’…’9’等价:

代码语言:javascript
复制
case ‘0’: case ‘1’: case ‘2’: case ‘3’: case ‘4’:
case ‘5’: case ‘6’: case ‘7’: case ‘8’: case ‘9’:

❤7. 语句表达式

包含在括号中的复合语句看成一个表达式,称为语句表达式,他可以出现在任何允许表达式的地方。

代码语言:javascript
复制
#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关键字

代码语言:javascript
复制
#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)的用法主要用于宏定义。

代码语言:javascript
复制
#define FREE(p) do{ free(p); p=NULL; } while(0)

如果去掉do{} while(0),则宏定义FREE为:

代码语言:javascript
复制
#define FREE(p) free(p); p=NULL;

例子:

代码语言:javascript
复制
if(p != NULL)
  FREE(p);
else
  break;

代码展开:

代码语言:javascript
复制
if(p != NULL)
  free(p); p=NULL;
else
  break;

你会发现代码怪怪的,对的明显有问题

①if分支之后有两个语句,导致else分支没有对应的if,编译出错,

②如果没有else分支,也会出问题,FREE中的第二条语句无论if条件是否成立,都会被执行

❤10. goto语句

之前有人跟我说尽量不要使用goto,但是linux里却使用的频繁,主要使用在错误处理。

①保证在错误处理时注销、资源释放。

②与正常的注册、资源申请顺序相反

代码语言:javascript
复制
if(a != 0)
  goto err;
if(b != 0)
  goto err1;

err1:
  retuen 0;
err:
  return 0;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档