おすすめのC言語のコード整形ツールを教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私が解説していきます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
Artistic Style(AStyle)
Artistic Style(AStyle)はC言語で利用可能なコード整形ツールです.
また,C++言語,Objective‑C言語,C#言語,Java言語に対応しています.
AStyleでは,主に以下のポイントで整形します.
- ブラケットスタイル
- インデント
- 括弧
- パディング
- フォーマット
- その他(サブディレクトリを再帰的に処理したい場合,処理から除外したい場合等に設定)
私がC言語でコードを書く時は,AStyleを利用してコードを整形します.
AStyleにより同じコーディングスタイルでコードを記述することで,コードの可読性や移植性が向上します.
特にチーム開発で有用ですので,C言語のコードを是非AStyleで整形しましょう.
AStyleは,Debian/Ubuntuではapt-get,Fedora/CentOS/RedHatではdnfで簡単にインストールできます.
1 |
$ sudo apt-get install astyle # dnf install astyle // Fedora/CentOS/RedHat |
私のAStyleの設定ファイル「astylerc」
私のAStyleの設定ファイル「astylerc」は以下になります.是非,参考にして下さい.
全ての設定のオプションは,こちらの記事に書いてあります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# # AStyle for C language # # Hiroyuki Chishiro # # "One True Brace Style" uses linux braces and adds braces to unbraced # one line conditional statements. Opening braces are broken from # namespaces, classes, and function definitions. The braces are attached # to everything else, including arrays, structs, enums, and statements # within a function. style=1tbs # Indent using # spaces per indent (e.g. -s3 --indent=spaces=3). # # must be between 2 and 20. Not specifying # will result in a default of # 4 spaces per indent. indent=spaces=2 # Pad empty lines around header blocks (e.g. 'if', 'for', 'while'...). break-blocks # Insert space padding around operators. This will also pad # commas. Any end of line comments will remain in the original column, # if possible. Note that there is no option to unpad. Once padded, they # stay padded. pad-oper # Insert space padding after commas. This is not needed if pad-oper is # used. Any end of line comments will remain in the original column, if # possible. Note that there is no option to unpad. Once padded, they # stay padded. pad-comma # Insert space padding between a header (e.g. 'if', 'for', 'while'...) # and the following paren. Any end of line comments will remain in the # original column, if possible. This can be used with unpad-paren to # remove unwanted spaces. pad-header # Remove extra space padding around parens on the inside and # outside. Any end of line comments will remain in the original column, # if possible. This option can be used in combination with the paren # padding options pad-paren, pad-paren-out, pad-paren-in, and pad-header # above. Only padding that has not been requested by other options will # be removed. # For example, if a source has parens padded on both the inside and # outside, and you want inside only. You need to use unpad-paren to # remove the outside padding, and pad-paren-in to retain the inside # padding. Using only pad-paren-in> would not remove the outside # padding. unpad-paren # Attach a pointer or reference operator (*, &, or ^) to either the # variable type (left) or variable name (right), or place it between the # type and name (middle). The spacing between the type and name will be # preserved, if possible. This option is for C/C++, C++/CLI, and C# # files. To format references separately, use the following # align-reference option. align-pointer=name # This option will align references separate from pointers. Pointers are # not changed by this option. If pointers and references are to be # aligned the same, use the previous align-pointer option. The option # align-reference=none will not change the reference alignment. The # other options are the same as for align-pointer. This option is for # C/C++, C++/CLI, and C# files. align-reference=name # Break one line headers (e.g. 'if', 'while', 'else', ...) from a # statement residing on the same line. If the statement is enclosed in # braces, the braces will be formatted according to the requested # brace style. # A multi-statement line will NOT be broken if keep-one-line-statements # is requested. One line blocks will NOT be broken if # keep-one-line-blocks is requested and the header is enclosed in the # block. break-one-line-headers # Add braces to unbraced one line conditional statements (e.g. 'if', # 'for', 'while'...). The statement must be on a single line. The # braces will be added according to the requested brace style. If no # style is requested the braces will be attached. # Braces will NOT be added to a multi-statement line if # keep-one-line-statements is requested. Braces will NOT be added to a # one line block if keep-one-line-blocks is requested. If used with # --add-one-line-braces, the result will be one line braces. add-braces # Indent C++ comments beginning in column one. By default C++ comments # beginning in column one are assumed to be commented-out code and not # indented. This option will allow the comments to be indented with the # code. indent-col1-comments # Attach the return type to the function name. The two options are for # the function definitions (-xf), and the function declarations or # signatures (-xh). They are intended to undo the --break-return-type # options. If used with --break-return-type, the result will be to # break the return type. This option has no effect on Objective-C functions. attach-return-type attach-return-type-decl # The option max-code-length will break a line if the code exceeds # # characters. The valid values are 50 thru 200. Lines without logical # conditionals will break on a logical conditional (||, &&, ...), # comma, paren, semicolon, or space. # Some code will not be broken, such as comments, quotes, and arrays. If # used with keep-one-line-blocks or add-one-line-braces the blocks will # NOT be broken. If used with keep-one-line-statements the statements # will be broken at a semicolon if the line goes over the maximum # length. If there is no available break point within the max code # length, the line will be broken at the first available break point # after the max code length. # By default logical conditionals will be placed first in the new # line. The option break-after-logical will cause the logical # conditionals to be placed last on the previous line. This option has # no effect without max-code-length. max-code-length=80 break-after-logical max-continuation-indent=80 # Indent a C type, C#, or Java file. C type files are C, C++, C++/CLI, # and Objective-C. The option is usually set from the file extension # for each file. You can override the setting with this entry. It will # be used for all files, regardless of the file extension. It allows # the formatter to identify language specific syntax such as C++ # classes, templates, and keywords. mode=c |
AStyleの利用例
AStyleの利用例として,以下のC言語のコードを整形します.
9~10行目にインデントがなくて読みにくいですね...
1 2 3 4 5 6 7 8 9 10 11 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } |
以下のコマンドでAStyleを実行して,C言語のコードを整形しましょう!
※AStyleの設定ファイル「astylerc」は,私の設定ファイルと同じ内容で,同じディレクトリに保存されているとします.
1 |
$ astyle astyle.c --options=astylerc |
整形したコードは以下になります.
9~10行目にインデントが入って読みやすくなりました.
1 2 3 4 5 6 7 8 9 10 11 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } |
AStyleによるインデントの調整を無効にする方法
AStyleによるインデントの調整を無効にする方法は,以下のように無効にしたい部分のコードを「/* *INDENT-OFF* */」と「/* *INDENT-ON* */」で挟みます.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { /* *INDENT-OFF* */ printf("Hello World!\n"); return 0; /* *INDENT-ON* */ } |
以下のコマンドでAStyleを実行した場合,インデントの調整が無効になることがわかります.
1 |
$ astyle astyle2.c --options=astylerc |
参考:C++言語のコードの整形はclang-formatがおすすめ
参考までに,C++言語のコードの整形はclang-formatがおすすめです!
clang-formatの使い方は以下の記事がわかりやすいです.
私のclang-formatの設定ファイル.clang-formatは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
--- Language: Cpp # BasedOnStyle: Google AccessModifierOffset: -1 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Left AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: All AllowShortIfStatementsOnASingleLine: true AllowShortLoopsOnASingleLine: true AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: true AlwaysBreakTemplateDeclarations: true BinPackArguments: true BinPackParameters: true BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false AfterFunction: true AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Custom BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeColon BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 2 ContinuationIndentWidth: 2 Cpp11BracedListStyle: true DerivePointerAlignment: true DisableFormat: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^<ext/.*\.h>' Priority: 2 - Regex: '^<.*\.h>' Priority: 1 - Regex: '^<.*' Priority: 2 - Regex: '.*' Priority: 3 IncludeIsMainRegex: '([-_](test|unittest))?$' IndentCaseLabels: true IndentPPDirectives: None IndentWidth: 2 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: false PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 1 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 200 PointerAlignment: Left RawStringFormats: - Language: TextProto Delimiters: - 'pb' - 'proto' BasedOnStyle: Google ReflowComments: true SortIncludes: true SortUsingDeclarations: true SpaceAfterCStyleCast: false SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeParens: ControlStatements SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 2 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Auto TabWidth: 2 UseTab: Never ... |
まとめ
C言語のコード整形ツールとしてAStyleを紹介しました.
また,私のAStyleの設定ファイルを公開していますので,C言語でコードを書く時の参考にしてください.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!