欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一、Linux下C代码格式化工具indent

程序员文章站 2022-07-15 11:00:41
...

引言

每个人的编程风格不尽相同,Linux作为开源项目,为了保证源码的可阅读性,就需要遵循Linux要求的“规则”,在内核源码的Documentation/CodingStyle中详细地记录了Linux的编程风格。大家感兴趣的话,可以去looklook。本文重点在于:GNU提供的格式化工具——indent。indent可用于从一种C代码的风格转换为另一种风格。

使用方法

执行以下命令,安装软件indent,执行Linux内核源码提供的脚本Lindent,便可以对我们的驱动代码进行格式化。

sudo apt install indent
./内核所在目录/scripts/Lindent my_module.c

贴一下脚本Lindent的代码:

#!/bin/sh
PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1"
RES=`indent --version`
V1=`echo $RES | cut -d' ' -f3 | cut -d'.' -f1`
V2=`echo $RES | cut -d' ' -f3 | cut -d'.' -f2`
V3=`echo $RES | cut -d' ' -f3 | cut -d'.' -f3`
if [ $V1 -gt 2 ]; then
  PARAM="$PARAM -il0"
elif [ $V1 -eq 2 ]; then
  if [ $V2 -gt 2 ]; then
    PARAM="$PARAM -il0";
  elif [ $V2 -eq 2 ]; then
    if [ $V3 -ge 10 ]; then
      PARAM="$PARAM -il0"
    fi
  fi
fi
indent $PARAM "[email protected]"

以上就是如何使用indent对我们的驱动代码进行格式化,标准化的一个流程,相当之简单,到这里就结束。后续的内容都是介绍indent工具的详细用法。

命令语法

indent [options] [input-files]

indent [options] [single-input-file] [-o output-file]

备份文件

indent会自动为我们的输入文件进行备份,默认的备份文件名是在原文件名的基础上加上“”,例如,文件名为“main.c”,对应的备份文件名为“main.c”。
我们可以通过设置环境变量SIMPLE_BACKUP_SUFFIX,来设置备份文件的后缀,例如,

export SIMPLE_BACKUP_SUFFIX=".bak"

这样的话,文件名为“main.c"的文件就变为“main.c.bak"。

常见的代码风格

  • 默认风格GUN
-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai
-saw -nsc -nsob
  • Kernighan&Ritchie风格
-nbad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0
-cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs
-nprs -npsl -saf -sai -saw -nsc -nsob -nss
  • original Berkeley风格
	
-nbad -nbap -bbo -bc -br -brs -c33 -cd33 -cdb -ce -ci4 -cli0
-cp33 -di16 -fc1 -fca -hnl -i4 -ip4 -l75 -lp -npcs -nprs -psl
-saf -sai -saw -sc -nsob -nss -ts8
  • Linux风格
-nbad -bap -nbc -bbo -hnl -br -brs -c33 -cd33 -ncdb -ce -ci4 
-cli0 -d0 -di1 -nfc1 -i8 -ip0 -l80 -lp -npcs -nprs -npsl -sai
-saf -saw -ncs -nsc -sob -nfca -cp33 -ss -ts8 -il1

空行(blank Line)

indent对空行的处理有以下几个选项:

  • -bad: 在变量定义以及注释之前加入空行
char *foo;
float *bar;
//int type 
int baz;

经过indent格式化后,就变成了

char *foo;
float *bar;

//int type 
int baz;
  • -nbad:与选项bad相反,在两者之间不加入空行
  • -bap:在程序主体之间加入空行,例如:
void func (void)
{


}
int main (void)
{

return 0;
}

上述代码中,main函数与func函数之间没有空行,使用bap选项进行格式化之后,变成:

void
func (void)
{


}

int
main (void)
{

  return 0;
}

  • -nbap:与bap相反,在两者之间不加入空行;
  • -bbb:注释前加入空行;
  • -nbbb:与选项bbb相反;
  • -sob:删除多余的空行,不包括indent格式化输出的空行;

注释

关于注释部分,C代码是以/* */进行代码的注释,indent会保留以下格式的注释,也就是不会被进行格式化

/**********************
 * Comment in a box!! *
 **********************/

/*
* A different kind of scent,
* for a different kind of comment.
*/

Comments which are not boxed comments may be formatted, which means that the line is broken to fit within a right margin and left-filled with whitespace.
提供以下选项:

  • fc1:针对放在每行最前端的注释,设置其格式。(PS:这里最后一个字符是阿拉伯数字1)
  • -fca:设置所有注释的格式。
  • -dn:针对不是放在程序码右侧的注释,设置其缩排格数。
 //comment

若执行indent -d2,则会变成:(上面的代码前有两个空格,被删除了)

//comment
  • cn:将注释置于程序码右侧指定的第n栏。
  • -cdb:注释符号自成一行,通常结合下面的sc一起使用
  • -sc:将"*"放在多行注释的开头。例如:
/* Loving hug */

执行indent -cdb -sc,则会变成

  /*
   * Loving hug
   */