重新格式化 C++ 大括号而不改变缩进?

发布于 2024-07-25 06:34:32 字数 617 浏览 7 评论 0原文

我们希望使 C++ 大括号样式更加一致。 现在,我们的代码包含以下内容的组合:

if (cond)
{
    // ...    
}
else
{
    // ...
}

...以及:

if (cond) {
    // ...
} else {
    // ...
}

我们希望专门使用后一种样式。

但是,我们不想更改代码的缩进。 我尝试过使用 astyle、bcpp、GNU indent 和 Uncrustify(并且我查看了 GreatCode 的命令行选项)。 不幸的是,这些工具中的每一个都坚持重新缩进我们的代码,并且它们中的大多数都非常严重地破坏了 C++ 构造函数初始值设定项列表和预处理器宏。

是否有任何 C++ 代码美化器可以修复大括号,同时保留缩进? 它不一定是一种预先存在的工具——如果您知道如何使用一些疯狂的 Perl 语句来完成此操作,那也很好。 谢谢你!

更新:是的,我们知道这将使阅读旧代码的差异变得困难。 这是一项拖延已久的代码清理工作,我们认为一致格式的日常优势胜过任何版本控制困难。

We would like to make our C++ brace style more consistent. Right now, our code contains a mix of:

if (cond)
{
    // ...    
}
else
{
    // ...
}

...and:

if (cond) {
    // ...
} else {
    // ...
}

We want to use the latter style exclusively.

However, we don't want to change the indentation of our code. I've tried using astyle, bcpp, GNU indent and Uncrustify (and I've looked at the command-line options for GreatCode). Unfortunately, each of these tools insists on reindenting our code, and most of them mangle C++ constructor initializer lists and preprocessor macros pretty badly.

Are there any C++ code beautifiers which can fix braces while leaving indentation alone? It doesn't have to be a pre-existing tool--if you know how to do this using some crazy Perl one-liner, that's also good. Thank you!

Update: Yes, we aware that this will make it hard to read diffs against older code. This is a long-postponed code cleanup, and we've decided that the day-to-day advantages of consistent formatting outweigh any version-control difficulties.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

戏蝶舞 2024-08-01 06:34:32

这是一个 Perl 语句,应该可以满足您的要求。

perl -pi.bak -e 'BEGIN { undef $/; } s/\s*?(\s?\/\/.*)?\r?\n\s*{/ {\1/g; s/}(\s?\/\/.*)?\r?\n\s*else\b(.*)/} else\2\1/g;'

它将这个: 变成

int main(int argc, char *argv[])
{
    int something = 0;
    if (something)    // 5-12-2007
    {
        printf("Hi!\n");
    }
    else   // 5-13-2007
    {
        printf("Bye\n");
    }
    return 0;
}

这样:

int main(int argc, char *argv[]) {
    int something = 0;
    if (something) { // 5-12-2007
        printf("Hi!\n");
    } else { // 5-13-2007
        printf("Bye\n");
    }
    return 0;
}

Here's a Perl one-liner that should do what you want.

perl -pi.bak -e 'BEGIN { undef $/; } s/\s*?(\s?\/\/.*)?\r?\n\s*{/ {\1/g; s/}(\s?\/\/.*)?\r?\n\s*else\b(.*)/} else\2\1/g;'

It turns this:

int main(int argc, char *argv[])
{
    int something = 0;
    if (something)    // 5-12-2007
    {
        printf("Hi!\n");
    }
    else   // 5-13-2007
    {
        printf("Bye\n");
    }
    return 0;
}

into this:

int main(int argc, char *argv[]) {
    int something = 0;
    if (something) { // 5-12-2007
        printf("Hi!\n");
    } else { // 5-13-2007
        printf("Bye\n");
    }
    return 0;
}
后来的我们 2024-08-01 06:34:32

在这样做之前,你真的应该三思而后行。 它将完全破坏源代码控制系统在更改时的修订历史记录。 您正在使用源代码控制系统,不是吗?

You really should think twice, and probably thrice, before doing this. It will completely destroy your source code control system's revision history at the point of change. You are using a source code control system, aren't you?

梦里的微风 2024-08-01 06:34:32
perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' yoursourcefile.cpp

这首先破坏了 }; <空白> else} else,然后从 中删除行尾 <空白> {

要将其应用到源代码树,请使用 findxargs

find . -name \*.cpp -print0 | xargs -0 perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}'
perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' yoursourcefile.cpp

This first mangles } <eol> <whitespace> else to } else, then removes end-of-lines from <eol> <whitespace> {.

To apply this to a source tree, use find and xargs:

find . -name \*.cpp -print0 | xargs -0 perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}'
晚雾 2024-08-01 06:34:32

UNIX 命令缩进 (http://en.wikipedia.org/wiki/Indent_(Unix) )(可用于 GNU 的 PC)有一百万个选项,可以根据您的喜好自定义重新格式化。

The UNIX command Indent (http://en.wikipedia.org/wiki/Indent_(Unix)) (Available for PCs from GNU) has a million options to customize the reformating exactly as you like.

|煩躁 2024-08-01 06:34:32

难道一手简单的正则表达式就不能解决问题吗? 就像 (\).?\n.?\{) -> (\) \{) 删除右括号和左大括号之间的空格。

Wouldn't a hand full of simple regexs do the trick? Like (\).?\n.?\{) -> (\) \{) to delete the space between a closing bracket and an opening curly bracket.

慵挽 2024-08-01 06:34:32

我过去解决过这样的问题,首先运行 astyle 之类的工具来完成我们想要的 95% 的工作,然后在结果上编写 Perl 或 Python 脚本来完成剩余的 5%。 尝试一下,了解正则表达式总是一个好习惯。 :)

I've tackled problems like this in the past by first running some tool like astyle to do 95% of what we wanted, and then writing a Perl or Python script over the result to finish the remaining 5%. Try it, it's always good practice to know your regular expressions. :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文