Visual Studioのコード整形にClang Formatを適用してみた

快適なプログラミング環境には,コード整形は必須です.

コード整形ルールがない場合,コードの見た目が悪くコーディングしている際に心の健康が害されます.

>> リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

私は普段VSCodeを愛用しており,コード整形にはClang-Fomatを使用しています.コーディングはVSCodeで統一したいのですが,業務の都合上Visual Studioを使用しないという場面に出くわしました.両者ともMicrosoftがリリースしているとはいえ別ソフトのため,コード整形の方法も異なります.

Clang-Formatとコード整形用のアプリケーションです.Visual StudioでもClang-Format簡単に導入できるため,Clang-Formatを利用してコード整形フォーマットを統一します.

今回は,Visual Studio 2022にClang-Formatを適用してみました.

目次

Clang formatのインストール

WindowsにClang formatを導入するために,LLVMをインストールします.GitHubにWindows用に予めビルドされたインストーラーがリリースされているため,ダウンロードします.

64bit用のインストールは下図のようにクリックします.

.exeを実行してインストールします.

特別な設定は必要ないため,「次に」を押し続けてインストールします.下図のようにインストール時に環境変数の設定を問われますが,パスを追加する必要はありません.

インストールディレクトリは,C:\Program Files\LLVMです.

アンインストールは,Uninstall.exeを実行するとアンインストーラーが起動します.

Visual Studio 2022の設定

ツールバーから[Tools] -> [Options]を選択します.

コード整形に関する設定は,[Text Editor] -> [C/C++] -> [Formatting]です.

下図のように,C:\Program Files\LLVM\bin\clang-format.exeを指定することで,FormatterがClang-Formatになります.

次に,Clang-Formatの設定ファイルである.clang-formatを,プロジェクトファイル.slnと同じディレクトリに設置します.

個人的に使用しているClang-Formatの設定ファイルは,次のようなものを使用しています.

.clang-format

BasedOnStyle: Google
IndentWidth: 4
AccessModifierOffset: -4
ColumnLimit: 100
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: Consecutive
AlignConsecutiveBitFields: Consecutive
AlignConsecutiveDeclarations: None
AlignConsecutiveMacros: AcrossEmptyLinesAndComments
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Empty
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: Empty
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: true
  AfterClass: true
  AfterControlStatement: Always
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: true
  AfterStruct: true
  AfterUnion: true
  AfterExternBlock: true
  BeforeCatch: true
  BeforeElse: true
  BeforeLambdaBody: true
  BeforeWhile: false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: false
BreakAfterJavaFieldAnnotations : true
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
BreakStringLiterals: true
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
Cpp11BracedListStyle: true
EmptyLineBeforeAccessModifier: Always
FixNamespaceComments: true
IncludeBlocks: Preserve
IndentCaseBlocks: false
IndentCaseLabels: true
IndentExternBlock: AfterExternBlock
IndentGotoLabels: false
IndentPPDirectives: BeforeHash
IndentRequires: false
IndentWrappedFunctionNames: true
KeepEmptyLinesAtTheStartOfBlocks: false
NamespaceIndentation: All
PointerAlignment: Left
ReflowComments: false
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceAroundPointerQualifiers: Before
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Latest

>> 良いコード/悪いコードで学ぶ設計入門―保守しやすい 成長し続けるコードの書き方

よかったらシェアしてね!
目次