C ++代码的最佳漂亮选项是什么?

时间:2009-07-08 17:40:19

标签: c++ code-formatting pretty-print

我的合作伙伴和我正在为一个关于C ++代码的漂亮打印机工作。该工具解析输入C ++代码并打印生成的AST,因此我们具有相当大的灵活性。我们已经为用户实现了一些控制输出的选项,现在我们正在寻找关于最重要选项的意见。如果您可以查看我们当前的(下面),然后告诉我们您喜欢/不喜欢什么,还有什么应该在那里,等等。这很好。

谢谢, 乔

以下是一些当前选项(对不起长度):


1。控制块


1.1 IndentString


定义用于每个缩进的空白字符串。

示例:

•IndentString“”

void f ()
{
  int a;
}

•IndentString“\ t”

void f ()
{
    int m;
}

1.2 OpenBraceLocation


有三个选项:“EndOfLine”,“NextLine”或“NextLineAsWellAsCloseParen”

在与其关联的关键字的相同或下一行上启动开括号。如果最后一个选项存在于下一行,则最后一个选项会在打开大括号之前移动它们。

适用于if,while,for,switch和do-while语句。

如果不存在,则使用“EndOfLine”选项。

示例:

•OpenBraceLocation EndOfLine

if(val){
    val++;
}

•OpenBraceLocation NextLine

if(val)
{
    val++;
}

•OpenBraceLocation NextLineAsWellAsCloseParen

if(val
){
    val++;
}

1.3 NoBracesAroundSingleStatementBlock


从只有一个语句的语句块中删除大括号。此选项适用于do-while,for,if和while块。

示例:

•NoBracesAroundSingleStatementBlock存在

if(a)
    func();

•NoBracesAroundSingleStatementBlock不存在

if(a)
{
    func();
}

2。类


2.1 virtualQualifier


选项包括:“Everywhere”或“Minimalist”。当使用“Everywhere”时,关键字“virtual”出现在基类中声明为虚拟的函数前面的所有派生类中。使用“极简主义”它只出现在基类中。

示例:

•virtualQualifier Everwhere

class Base
{
    virtual void f(int a);
}

class Derived : public Base
{
    virtual void f( int a);

class MostDerived : public Derived
{
    virtual void f( int a);

•virtualQualifier极简主义

class Base
{
    virtual void f(int a);
}

class Derived : public Base
{
    void f( int a);

class MostDerived : public Derived
{
    void f( int a);

2.2 SortClassMembers


级别选项是“访问”,“数据/功能”或“功能/数据”和“Alpha”。如果没有提供level-option或者SortClassMember不存在,则成员的顺序不变。

示例:

•SortClassMembers数据/函数访问Alpha

class Compiler 
{
private:
    string inputFileName;
public:
    Compiler( string const & inputFileName_);
    genOutput( string const & outputFileName_);
private:
    analyze();
    emitCode( string const & );
    parse();
    tokenize( string const & inputFileName_);
}

•SortClassMembers访问函数/数据Alpha

class C
{
public:
    Compiler( string const & inputFileName_);
    genOutput( string const & outputFileName_);
private:
    analyze();
    emitCode( string const & );
    parse();
    tokenize( string const & inputFileName_);
private:
    string inputFileName;
}

•SortClassMembers访问Alpha

class C
{
public:
    Compiler( string const & inputFileName_);
    genOutput( string const & outputFileName_);
private:
    analyze();
    emitCode( string const & );
    string inputFileName;
    parse();
    tokenize( string const & inputFileName_);
}

3。文件


3.1 MaxLineWidth


定义最大线宽。如果可能的话,PrettyC ++会智能地包裹更长的行。

示例:

•MaxLineWidth 80

int x = 123456789;

•MaxLineWidth 10

int x =
123456789;

3.2 constLocation


选项是“之前”或“之后”。 Before选项将const关键字放在类型说明符之前。 After选项将const关键字放在类型说明符之后。

示例:

•之前的constLocation

const int x;

•constLocation

之后
int const x;

4。名称


4.1 AllNamesStartCase


选项是“LowerCase”或“UpperCase”。

示例:

•AllNamesStartCase LowerCase

int variable = 123456789;

•AllNamesStartCase UpperCase

int Variable = 123456789;

4.2 AllNamesDelimitWords


选项为“CaseDelimited”或“UnderscoreDelimited”。单词由大写字母开头或以下划线表示。

示例:

•AllNamesDelimitWords CaseDelimited

int myVariable = 123456789;

•AllNamesDelimitWords UnderscoreDelimited

int my_variable = 123456789;

4.3 FunctionNamesStartCase


选项是“LowerCase”或“UpperCase”。

示例:

•FunctionNamesStartCase LowerCase

void function() { return; }

•FunctionNamesStartCase UpperCase

void Function() { return; }

4.4 FunctionNamesDelimitWords


选项为“CaseDelimited”或“UnderscoreDelimited”。单词由大写字母开头或以下划线表示。

示例:

•FunctionNamesDelimitWords CaseDelimited

void myFunction() { return; }

•FunctionNamesDelimitWords UnderscoreDelimited

void my_function() { return; }

7 个答案:

答案 0 :(得分:2)

我在代码格式化程序中遗漏的一件事让我对代码的结构有了更多的暗示。我常常发现自己在连续几行中插入几乎相同的陈述来强调它们的对应和差异,就像这样:

auto_ptr<Base::Int> x1 = get<DataModelI::Base::Int>( context, c_Input1 );
auto_ptr<Base::Real> x2 = get<DataModelI::Base::Real>( context, c_Input2 );
auto_ptr<Composite::Array> x3 = get<Composite::Array>( context, c_Input3 );
auto_ptr<Base::Real> x4 = get<DataModelI::Base::Real>( context, c_Input4 );

进入那个

auto_ptr<Base::Int       > x1 = get<DataModelI::Base::Int >( context, c_Input1 );
auto_ptr<Base::Real      > x2 = get<DataModelI::Base::Real>( context, c_Input2 );
auto_ptr<Composite::Array> x3 = get<Composite::Array      >( context, c_Input3 );
auto_ptr<Base::Real      > x4 = get<DataModelI::Base::Real>( context, c_Input4 );

这是完全不可维护的:当添加另一个更长的行时,我会浪费时间缩进所有之前的行。是的,我确实读过Code Complete并且部分同意他们对此的陈述:)

如果你能为观众添加这种(非常人性化和主观的)美学启发式,我会很高兴听到它。

我希望我的代码尽可能清晰。在我的梦想代码查看器中,我可以切换查看using声明 - 也许我甚至不需要它们:我可以切换全命名空间查看,可以隐藏局部变量声明,只关注控制流,...

答案 1 :(得分:1)

我建议看看日食代码格式化程序。它可能适用于Java,但它仍然有很多适用于C ++的选项。否则,你现在看起来对我来说很好,但也许有点稀疏...我会详细说明,但我现在没有时间,我相信其他人也会回答......

此外,Eclipse确实支持C ++,但我以前从未看过它,但我认为它也会有代码格式化程序。

答案 2 :(得分:1)

GNU Indent是一个专为C或C ++设计的自动缩进程序。如果您愿意,可以查看选项或来源。

答案 3 :(得分:1)

查看Vera++

答案 4 :(得分:1)

嗯,我非常喜欢。它与astyle不同吗? Astyle非常适合这种事情。

答案 5 :(得分:0)

据我所知,一般的智慧是挑选一种风格并随之而去。只要你选择一种风格,你挑选的风格并不重要。请参阅python以获取强制执行特定样式的语言的一个很好的示例,虽然它让一些人感到烦恼,但它的效果非常好。

我猜人们倾向于关心的那个是

  • 缩进,空格与制表符和空格数(或制表符所代表的空格数)
  • 大括号的位置
  • 运营商for(int i=0...for(int i = 0...
  • 周围的空格
  • 之后的空格(

我不感兴趣的事情:

  • 对班级成员进行排序
  • 自动执行变量命名方案(它们应该就位,但有太多的极端情况会导致麻烦)
  • 线长限制对我来说是一个痛苦的问题。根据我们代码的哪个区域,我将严格使用80.但实际上,现代IDE可以处理更长的线路而不会有太多麻烦。但随后印刷成为一种痛苦。无论如何这很难自动化。再过多的角落案例会导致麻烦,需要进行调整。

答案 6 :(得分:0)

样式格式化程序怎么样?例如格式如下:gnu,bsd,k&amp; r等

e.g。 http://en.wikipedia.org/wiki/Indent_style