2

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

谢谢,乔

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


1. 控制块


1.1 缩进字符串


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

例子:

• 缩进字符串“”</p>

void f ()
{
  int a;
}

• 缩进字符串“\t”</p>

void f ()
{
    int m;
}

1.2 OpenBrace 位置


三个选项是:“EndOfLine”、“NextLine”或“NextLineAsWellAsCloseParen”</p>

在与其关联的关键字的同一行或下一行开始打开大括号。如果最后一个选项也存在于下一行,则最后一个选项将左括号移到左括号之前。

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

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

例子:

• OpenBraceLocation EndOfLine

if(val){
    val++;
}

• OpenBraceLocation 下一行

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 虚拟限定符


选项是:“无处不在”或“极简主义”。当使用“Everywhere”时,关键字“virtual”出现在所有派生类中,位于基类中声明为 virtual 的函数前面。对于“极简主义”,它只出现在基类中。

例子 :

• virtualQualifier 无处不在

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 排序类成员


级别选项是“Access”、“Data/Functions”或“Functions/Data”和“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 最大线宽


定义最大线宽。如果可能,PrettyC++ 将智能地换行更长的行。

例子:

• 最大线宽 80

int x = 123456789;

• 最大线宽 10

int x =
123456789;

3.2 构造位置


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

例子 :

• constLocation 之前

const int x;

• constLocation 之后

int const x;

4.名称


4.1 AllNamesStartCase


选项是“小写”或“大写”。

例子:

• AllNamesStartCase 小写

int variable = 123456789;

• AllNamesStartCase 大写

int Variable = 123456789;

4.2 AllNamesDelimitWords


选项是“CaseDelimited”或“UnderscoreDelimited”。单词以大写字母开头或后跟下划线标识。

例子:

• AllNamesDelimitWords CaseDelimited

int myVariable = 123456789;

• AllNamesDelimitWords UnderscoreDelimited

int my_variable = 123456789;

4.3 FunctionNamesStartCase


选项是“小写”或“大写”。

例子:

• FunctionNamesStartCase 小写

void function() { return; }

• FunctionNamesStartCase 大写

void Function() { return; }

4.4 FunctionNamesDelimitWords


选项是“CaseDelimited”或“UnderscoreDelimited”。单词以大写字母开头或后跟下划线标识。

例子:

• FunctionNamesDelimitWords CaseDelimited

void myFunction() { return; }

• FunctionNamesDelimitWords UnderscoreDelimited

void my_function() { return; }
4

7 回答 7

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声明——也许我什至不需要它们:我可以切换全命名空间查看,可以隐藏局部变量声明以只关注控制流,...

于 2009-07-08T20:37:43.360 回答
1

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

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

于 2009-07-08T17:47:02.427 回答
1

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

于 2009-07-08T17:51:42.730 回答
1

看看维拉++

于 2009-07-08T18:18:23.487 回答
1

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

于 2009-07-08T20:25:33.293 回答
0

据我所知,一般的智慧是选择一种风格并顺其自然。只要你选择一种,你选择什么风格并不重要。请参阅 python 以获得强制执行特定样式的语言的一个很好的示例,虽然它让一些人感到厌烦,但它工作得很好。

我想人们往往关心的是

  • 缩进,空格与制表符和空格数(或制表符代表的空格数)
  • 支架去哪里
  • 运算符周围的空间for(int i=0...vsfor(int i = 0...
  • if 之前的空格 (

我不会感兴趣的事情:

  • 对类的成员进行排序
  • 自动执行变量命名方案(它们应该就位,但有太多的极端情况会导致麻烦)
  • 行长限制对我来说是个痛点。根据我们代码的哪个区域,我将严格使用 80。但实际上,现代 IDE 可以处理更长的行而不会带来太多麻烦。但是随后打印变得很痛苦。无论如何,这很难很好地自动化。再次有太多的极端情况会导致麻烦并且需要进行调整。
于 2009-07-08T18:43:20.080 回答
0

样式格式化程序怎么样。例如,格式根据:gnu、bsd、k&r 等

例如http://en.wikipedia.org/wiki/Indent_style

于 2009-07-08T23:36:51.190 回答