我的合作伙伴和我正在为一个关于C ++代码的漂亮打印机工作。该工具解析输入C ++代码并打印生成的AST,因此我们具有相当大的灵活性。我们已经为用户实现了一些控制输出的选项,现在我们正在寻找关于最重要选项的意见。如果您可以查看我们当前的(下面),然后告诉我们您喜欢/不喜欢什么,还有什么应该在那里,等等。这很好。
谢谢, 乔
以下是一些当前选项(对不起长度):
定义用于每个缩进的空白字符串。
示例:
•IndentString“”
void f ()
{
int a;
}
•IndentString“\ t”
void f ()
{
int m;
}
有三个选项:“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++;
}
从只有一个语句的语句块中删除大括号。此选项适用于do-while,for,if和while块。
示例:
•NoBracesAroundSingleStatementBlock存在
if(a)
func();
•NoBracesAroundSingleStatementBlock不存在
if(a)
{
func();
}
选项包括:“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);
级别选项是“访问”,“数据/功能”或“功能/数据”和“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_);
}
定义最大线宽。如果可能的话,PrettyC ++会智能地包裹更长的行。
示例:
•MaxLineWidth 80
int x = 123456789;
•MaxLineWidth 10
int x =
123456789;
选项是“之前”或“之后”。 Before选项将const关键字放在类型说明符之前。 After选项将const关键字放在类型说明符之后。
示例:
•之前的constLocation
const int x;
•constLocation
之后int const x;
选项是“LowerCase”或“UpperCase”。
示例:
•AllNamesStartCase LowerCase
int variable = 123456789;
•AllNamesStartCase UpperCase
int Variable = 123456789;
选项为“CaseDelimited”或“UnderscoreDelimited”。单词由大写字母开头或以下划线表示。
示例:
•AllNamesDelimitWords CaseDelimited
int myVariable = 123456789;
•AllNamesDelimitWords UnderscoreDelimited
int my_variable = 123456789;
选项是“LowerCase”或“UpperCase”。
示例:
•FunctionNamesStartCase LowerCase
void function() { return; }
•FunctionNamesStartCase UpperCase
void Function() { return; }
选项为“CaseDelimited”或“UnderscoreDelimited”。单词由大写字母开头或以下划线表示。
示例:
•FunctionNamesDelimitWords CaseDelimited
void myFunction() { return; }
•FunctionNamesDelimitWords UnderscoreDelimited
void my_function() { return; }
答案 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...
我不感兴趣的事情:
答案 6 :(得分:0)
样式格式化程序怎么样?例如格式如下:gnu,bsd,k&amp; r等