代码格式化工具Astyle的使用

       dddd,工作中总会遇到一言难尽、阅读性低的代码,真的能逼疯一个处女座码农,但是手动改任务量又太重了,这个时候格式化工具就尤为重要。

       代码格式化工具选择astyle主要是感觉比较容易上手,且开放源代码,版本一直在保持更新;

1. 使用方法

  1. 在官网下载最新版本:Artistic Style download | SourceForge.net
  2. 将压缩包解压到Windows目录下,找到Astyle.exe存放目录,把其Path加入环境变量;
  3. 编写bat脚本,选择适配项目编码规范的参数;
  4. 将.bat文件放到需要格式化的目录下,双击运行即可;

2. Recommended adaptation parameters

嵌入式C推荐的参数如下:

@echo on

REM 批量将本目录中的所有C文件用Astyle进行代码格式化操作
REM 设置Astyle命令位置和参数
set astyle="astyle.exe"

REM 循环遍历目录
REM for /r ./SDK %%f in (*.c;*.h) do %astyle% --mode=c --indent=spaces=4 --convert-tabs --pad-oper --pad-comma --pad-header --unpad-paren --align-pointer=name -n "%%f"

%astyle% --mode=c --indent=spaces=4 --convert-tabs --pad-comma --pad-header --unpad-paren --indent-preproc-block --indent-switches --min-conditional-indent=0 --align-pointer=name --keep-one-line-blocks --keep-one-line-statements --ignore-exclude-errors -n -r "./*.c,*.h"

REM 1--mode=c:对于C文件进行缩进。该选项通常根据每个文件的扩展名进行设置。你可以使用此条目覆盖设置。它将用于所有文件,无论文件扩展名如何。这样可以让格式化程序识别特定C语言的语法。
REM 2--indent=spaces=4:一个完整的Tab键用4个空格代替
REM 3--convert-tabs:将行中非缩进部分的制表符转换为空格。
REM 4--pad-comma:在逗号后插入空格填充。
REM 5--pad-header:在header (例如“if”、“for”、“while”…)和后面的小括号之间插入空格填充。--pad-header这个操作可以使用--unpad-paren / -U以删除之前填充的空格。
REM 6--unpad-paren:移除括号内部和外部的额外空格填充。只有没有被其他选项请求的填充才会被移除。
REM 7--indent-preproc-block:在大括号级别0处缩进预处理器块,并立即在命名空间中缩进。
REM x--indent-preproc-cond:将预处理器条件语句缩进到与源代码相同的级别。
REM 8--indent-switches:在switch块中缩进“case X:”语句。
REM 9--min-conditional-indent=0:当一条语句被拆分成多行时,这些行将与前一行的括号对齐。
REM 10--align-pointer=name:将指针或引用运算符(*、&或^)附加到变量名称(右)。如char *foo1、char &foo2;
REM 11--keep-one-line-blocks:不拆分单行代码块。
REM 12--keep-one-line-statements:不要拆分复杂语句和在单行上存在的多个语句。
REM 13--exclude="SelfTest":指定从处理中排除的文件或子目录####。
REM 14--ignore-exclude-errors:即使在"exclude=###"选项中存在错误,也允许继续处理。
REM 15-n:不要保留原始文件的备份。格式化原始文件后会清除该文件。
REM 16-r:对于命令行中的每个目录,递归地处理所有子目录。使用递归选项时,文件名语句应包含通配符。

pause

3. Artistic Style 3.5 (June 2024)存在的问题

4. Style Options

以下是Astyle的一些命令参数说明~ 

Brace Style Options

        Astyle内置了15种大括号风格选项。

--style=allman / --style=bsd / --style=break / -A1

Allman style

int Foo(bool isBar)
{
    if (isBar)
    {
        bar();
        return 1;
    }
    else
        return 0;
}

--style=java / --style=attach / -A2

Java style

int Foo(bool isBar) {
    if (isBar) {
        bar();
        return 1;
    } else
        return 0;
}

--style=kr / --style=k&r / --style=k/r / -A3

Kernighan & Ritchie style

  • uses linux braces.
  • namespaces, 类和函数定义的括号另起一行对齐写;
  • 其他所有包括函数中的数组、结构、枚举和语句等,大括号都是紧跟其后。
  • 使用k&r风格可能会由于&而导致一些问题。这可以通过将k&r括在引号中(例如‑style=“k&r”)或使用‑style=kr或‑style=k/r中的一种来解决。
int Foo(bool isBar)
{
    if (isBar) {
        bar();
        return 1;
    } else
        return 0;
}

--style=stroustrup / -A4

Stroustrup style

  • uses linux braces with closing headers broken from closing braces (e.g. ‑‑break‑closing‑headers).
  • 仅函数定义的括号另起一行对齐写;
  • 其他所有包括namespaces、类、函数中的数组、结构、枚举和语句等,大括号都是紧跟其后。
  • 这种风格通常与“attach-closing-while”、制表符缩进和5个空格的缩进一起使用。
int Foo(bool isBar)
{
    if (isBar) {
        bar();
        return 1;
    }
    else
        return 0;
}

--style=whitesmith / -A5

Whitesmith style

  • 全部使用另起一行的、缩进的大括号。
  • Switch 块和class块缩进,以防止使用以下case语句和C++类修饰符(public、private、protected)进行“挂起缩进”。 
int Foo(bool isBar)
    {
    if (isBar)
        {
        bar();
        return 1;
        }
    else
        return 0;
    }

--style=vtk / -A15

VTK (Visualization Toolkit) style

  • 类、数组、结构、枚举和函数定义,这些的大括号另起一行对齐写,其他的大括号另起一行缩进写。
  • 开关块缩进,以防止以下case语句出现“挂起缩进”。
int Foo(bool isBar)
{
    if (isBar)
        {
        bar();
        return 1;
        }
    else
        return 0;
}

--style=ratliff / --style=banner / -A6

Ratliff style

  • 左大括号紧跟其后,右大括号另起一行缩进写;
  • 开关块和类块是缩进的,以防止使用以下case语句和C++类修饰符(public、private、protected)进行“挂起缩进”。
int Foo(bool isBar) {
    if (isBar) {
        bar();
        return 1;
        }
    else
        return 0;
    }

--style=gnu / -A7

GNU style

  • 仅函数的大括号另起一行对齐写,其余的大括号另起一行缩进写;
  • 整个块是缩进的,而不仅仅是大括号。此样式通常用于缩进2个空格。
int Foo(bool isBar)
{
    if (isBar)
        {
            bar();
            return 1;
        }
    else
        return 0;
}

--style=linux / --style=knf / -A8

Linux style

  • uses linux braces.
  • 大括号与命名空间、类和函数定义的大括号另起一行对齐写。
  • 其他所有包括函数中的数组、结构、枚举和语句的大括号紧跟其后。
  • 最小条件缩进为半缩进。如果需要不同的最小条件缩进,请改用K&R样式。这种样式最适合大缩进。它经常与8个空格的缩进一起使用。
  • 也称为内核范式(KNF)样式,这是Linux BSD内核中使用的样式。
int Foo(bool isBar)
{
        if (isFoo) {
                bar();
                return 1;
        } else
                return 0;
}

--style=horstmann / --style=run-in / -A9

Horstmann style

  • uses broken braces and run-in statements.
  • 大括号全部另起一行对齐写,
  • 大括号后 缩进写 代码块。此样式通常与3个空格的缩进一起使用。
int Foo(bool isBar)
{   if (isBar)
    {   bar();
        return 1;
    }
    else
        return 0;
}

// 后面的几种风格我用的比较少,就不一一介绍啦

// 具体风格规则可以点击Artistic Style链接查看哦~

Tab Options

图示代码中"."小点代表空格,">"大于号代表一个Tab键。

-s4 / --indent=spaces=4

default indent:如果命令行中没写tab的参数,那么格式化默认是使用4个空格;

void Foo() {
....if (isBar1
............&& isBar2) // indent of this line can be changed with min-conditional-indent
........bar();
}

--indent=spaces / --indent=spaces=# / -s#

使用#表示缩进的空格数,例如命令参数 -s3 --indent=spaces=3表示缩进3个空格。#必须介于2和20之间。如果未设置#,则缩进默认为4个空格。

void Foo() {
...if (isBar1
.........&& isBar2) // indent of this line can be changed with min-conditional-indent
......bar();
}

--indent=tab / --indent=tab=# / -t / -t#

使用制表符进行缩进,使用空格进行连续行对齐。这确保了无论查看器的选项卡大小如何,代码都能正确显示。使用#表示缩进的空格数,例如-t6/--indent=tab=6。#必须介于2和20之间。如果未设置#,则缩进默认为4个空格。

with indent=tab:

void Foo() {
>   if (isBar1
>   ........&& isBar2)    // indent of this line can be changed with min-conditional-indent
>   >   bar();
}
with style=linux, indent=tab=8:

void Foo()
{
>       if (isBar1
>       ....&& isBar2)    // indent of this line can NOT be changed with style=linux
>       >       bar();
}
 

--indent=force-tab / --indent=force-tab=# / -T / -T#

如果可能,全部使用制表符缩进。如果续行不是偶数个制表符,则将在末尾添加空格。将每个制表符视为#空格,例如-T6 / --indent=force-tab=6。#必须介于2和20之间。如果未设置#,则将制表符视为4个空格。

void Foo() {
>   if (isBar1
>   >   >   && isBar2)    // indent of this line can be changed with min-conditional-indent
>   >   bar();
}

// 后面的几种风格我用的比较少,就不一一介绍啦

// 具体风格规则可以点击Tab Options链接查看哦~

Brace Modify Options

--attach-closing-while / -xV

将“do while”语句的结束“while”,附加到结束大括号后。这优先于"大括号样式"和“断开闭合大括号”选项。

do
{
    bar();
    ++x;
}
while x == 1;
becomes:

do
{
    bar();
    ++x;
} while x == 1;

--attach-extern-c / -xk

将大括号附加到带大括号的extern “C”语句。无论使用何种大括号样式,都会执行此操作。此选项仅对C++文件有效。作为函数定义一部分的extern“C”语句根据所选择的大括号样式进行格式化。大括号extern“C”语句不受大括号样式的影响,此选项是更改它们的唯一方法。

this option attaches braces to a braced extern "C" statement:

#ifdef __cplusplus
extern "C" {
#endif
but function definitions are formatted according to the requested brace style:

extern "C" EXPORT void STDCALL Foo()
{}

// 后面的几种风格我用的比较少,就不一一介绍啦

// 具体风格规则可以点击Brace Modify Options链接查看哦~

Indentation Options

--indent-col1-comments / -Y

从第一列开始缩进注释。默认情况下,从第一列开始的注释假定为注释代码,而不是缩进。此选项将允许注释与代码一起缩进。

void Foo()\n"
{
// comment
    if (isFoo)
        bar();
}
becomes:

void Foo()\n"
{
    // comment
    if (isFoo)
        bar();
}

 // 后面的几种风格我用的比较少,就不一一介绍啦

// 具体风格规则可以点击Indentation Options链接查看哦~

Padding Options

--pad-oper / -p

在运算符周围插入空格。逗号也是。如果可能,任何行尾注释将保留在原始列中。请注意,没有取消粘贴空格的选项。一旦被插入空格,它们就保持这种状态。

if (foo==2)
    a=bar((b-c)*a,d--);
becomes:

if (foo == 2)
    a = bar((b - c) * a, d--);

--pad-comma / -xg 

在逗号后插入空格填充。如果使用pad oper,则不需要此操作。如果可能,任何行尾注释将保留在原始列中。请注意,没有取消--pad-comma的选项。一旦被填充空格,它们就保持填充状态。

if (isFoo(a,b))
    bar(a,b);
becomes:

if (isFoo(a, b))
    bar(a, b);

--pad-header / -H

在header (例如“if”、“for”、“while”…)和后面的小括号之间插入空格填充。如果可能,任何行尾注释将保留在原始列中。与前面两个不一样的是,--pad-header这个操作可以使用--unpad-paren / -U以删除之前填充的空格。

if(isFoo((a+2), b))
    bar(a, b);
becomes:

if (isFoo((a+2), b))
    bar(a, b);

// 后面的几种风格我用的比较少,就不一一介绍啦

// 具体风格规则可以点击Padding Options链接查看哦~

Formatting Options

--break-closing-braces / -y

当与--style=java、--style=kr、--style=stroustrup、--style=linux或--style=1tbs一起使用时,这会将收尾的header(例如“else”、“catch”和“…”)与其前一个收尾大括号分开。在其他大括号样式中,收尾大括号总是断开的。

void Foo(bool isFoo) {
    if (isFoo) {
        bar();
    } else {
        anotherBar();
    }
}
becomes (a broken 'else'):

void Foo(bool isFoo) {
    if (isFoo) {
        bar();
    }
    else {
        anotherBar();
    }
}

// 后面的几种风格我用的比较少,就不一一介绍啦

// 具体风格规则可以点击Formatting Options链接查看哦~

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Source Insight是一个流行的用于编辑C/C++程序的工具,但它本身并没有提供代码格式化的功能。但是,我们可以通过集成Artistic Style工具来实现代码格式化的功能。 具体步骤如下: 1. 首先,确保你已经安装了Artistic Style工具,并且知道它的安装路径。 2. 打开Source Insight,并选择菜单中的"Options->Custom Commands->Add"。 3. 在弹出的对话框中,输入一个任意的名字,比如"Artistic Style"。 4. 在"Run"一栏中,输入Artistic Style工具的路径和参数,例如:"C:/ArtisticStyle/Astyle.exe --options=c.opt %f"。这里,%f表示当前文件的路径。 5. 留空"Dir"一栏。 6. 在"Iconic Window","Capture Output","Parse Links in Output","File, then Line"这四项前打上勾。 7. 点击对话框中右侧的"Menu"按钮。 8. 在弹出的菜单编辑界面中,选择"Menu->Menu->View-><end of menu>"。 9. 点击右侧的"Insert"按钮,并点击"OK"保存更改。 10. 现在,在Source Insight的"View"菜单下会出现一个"Style"子菜单选项。你可以使用它来对单个C/C++文件进行格式化。 11. 如果你想要格式化选中的代码片段,只需要选择代码然后执行格式化命令即可。如果你没有选择任何代码,只保留一个插入符,那么将对整个文件进行格式化。 通过以上步骤,你可以在Source Insight中实现代码格式化的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [source insight代码格式化](https://blog.csdn.net/wzk456/article/details/24302975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [工具及方法 - 在Source Insight中使用代码格式化工具](https://blog.csdn.net/guoqx/article/details/125437423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值