快適なプログラミング環境には,コード整形は必須です.
コード整形ルールがない場合,コードの見た目が悪くコーディングしている際に心の健康が害されます.
>> リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
私は普段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