6

我们想让我们的 C++ 大括号样式更加一致。现在,我们的代码包含以下内容:

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

...和:

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

我们想专门使用后一种风格。

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

是否有任何 C++ 代码美化器可以修复大括号,同时保持缩进?它不必是一个预先存在的工具——如果你知道如何使用一些疯狂的 Perl 单线来做到这一点,那也很好。谢谢!

更新:是的,我们知道这将使阅读旧代码的差异变得困难。这是一个被推迟很久的代码清理,我们认为一致格式的日常优势超过了任何版本控制困难。

4

6 回答 6

7

这是一个 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;
}
于 2009-06-12T12:42:13.710 回答
3

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

于 2009-06-12T12:17:39.573 回答
3
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

这首先破坏} <eol> <whitespace> else} else,然后从 中删除行尾<eol> <whitespace> {

要将其应用于源代码树,请使用findand 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;}'
于 2009-06-12T12:42:59.230 回答
2

UNIX 命令 Indent ( http://en.wikipedia.org/wiki/Indent_(Unix) )(适用于 GNU 的 PC)有一百万个选项可以完全按照您的喜好自定义重新格式化。

于 2009-06-12T12:17:47.327 回答
1

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

于 2009-06-12T12:27:29.720 回答
0

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

于 2009-06-12T15:02:50.033 回答