web-dev-qa-db-ja.com

関数の括弧を開く前にclang形式で新しい行を追加する方法

関数に開き括弧を付けることに興味があります(ifステートメントやその他のコンテキストは対象外です)。例えば

void foo()
{
   ...
}

Flamewarsはさておき、notを実行するための良い根拠はありますか?私はif/elseと小さいブロックに同じ行のオープンブラケットを使用していますが、この場合、コードのより大きな単位(関数/メソッド/クラス/構造体)の視覚的な整理が完全な一貫性よりも優れていると思います。

さらに、どのように私はclang-formatがこのスタイルに従うようにしますか?

18
daj

documentation が示すように、clang-format-style=fileで呼び出し、囲みディレクトリに配置された.clang-formatファイルを使用してスタイルオプションをカスタマイズします。ブレースの配置を指定するフォーマットスタイルオプションは、BreakBeforeBracesと呼ばれます。ドキュメントから、

BreakBeforeBracesBraceBreakingStyle

使用するブレースブレイキングスタイル。

可能な値:

  • BS_Attach(構成:Attach)常に前後のコンテキストに中括弧を付けます。
  • BS_Linux(構成:LinuxAttachと似ていますが、関数、名前空間、およびクラス定義の括弧の前で中断します。
  • BS_Stroustrup(構成内:StroustrupAttachに似ていますが、関数定義の前で中断し、「else」です。
  • BS_Allman(構成:Allman)中括弧の前で常に中断します。
  • BS_GNU(構成内:GNU)中括弧の前で常に改行し、クラス、関数、またはその他の定義ではなく、制御ステートメントの中括弧に追加レベルのインデントを追加します。

説明に一致するスタイルはBS_Stroustrupです。次のエントリを.clang-formatに追加します

BreakBeforeBraces: Stroustrup

ドキュメントに加えて、 clangformat.com はすべてのオプションをリストし、それらの多くを例とともに示します。

24
Pradhan

Pradhanには 優れた答え がありますが、(私が見つけたように)必要のない場所で休憩をとることがあります。

少なくともclang形式のバージョン3.8および5には、「カスタム」という別のオプションがあります(3.8を使用していて、5つのドキュメントでBS_Customを見つけました)。これにより、BraceWrappingで「AfterFunction」オプションを含め、必要なものを指定できます。

次の例の抜粋では、OPの質問でAfterFunctionのみが指定されているため(つまり、「関数の括弧を開く前」)、他のユーザーをtrue/falseとしてリストしています。

BraceWrapping:
  AfterClass:      true
  AfterControlStatement: true
  AfterEnum:       true/false
  AfterFunction:   true
  AfterNamespace:  true/false
  AfterObjCDeclaration: true/false
  AfterStruct:     true/false
  AfterUnion:      true/false
  BeforeCatch:     true/false
  BeforeElse:      true/false
  IndentBraces:    true/false
BreakBeforeBraces: Custom

私はこれを自分の構成でテストしましたが、ブレースの破損をより細かく制御できます。

12
sage