C++ では、clang-format を利用してソースコードの自動フォーマットが可能です。
Visual Studio Code の場合は、C/C++ 拡張機能に clang-format が組み込まれており、Clang_format_fallback Style 項目にてカスタマイズが可能です。
この設定に、”LLVM” や “Google” などの文字列を指定することで、プリセットのベーススタイルを選択することができます。
clang-format にはいくつかのベーススタイルが最初から用意されています。
この記事では、これらの簡単な比較を示します。
各ベーススタイルの比較
none
ベーススタイルを比較するために、次のような改行の少ないソースコードを準備しました。
これに対して自動フォーマットされたものを比較していきます。
#include <iostream>
namespace Project { class MyClass { public: MyClass(int value) : value_(value) {} private: int value_; }; }
int main() { for (std::size_t i = 0; i < 10; ++i) { if (i % 2 == 0) { std::cout << i << " : even" << std::endl; } else { std::cout << i << " : odd" << std::endl; } } return 0; }
Visual Studio
Visual Studio Code 拡張機能に特有のベーススタイルです。
Visual Studio C++ のデフォルトフォーマットっぽい名称ですが、括弧の扱いなどを見るとそういうわけでもなさそうです。
#include <iostream>
namespace Project
{
class MyClass
{
public:
MyClass(int value) : value_(value) {}
private:
int value_;
};
}
int main()
{
for (std::size_t i = 0; i < 10; ++i)
{
if (i % 2 == 0)
{
std::cout << i << " : even" << std::endl;
}
else
{
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
LLVM
LLVM Coding Standards に従ったフォーマットです。
#include <iostream>
namespace Project {
class MyClass {
public:
MyClass(int value) : value_(value) {}
private:
int value_;
};
} // namespace Project
int main() {
for (std::size_t i = 0; i < 10; ++i) {
if (i % 2 == 0) {
std::cout << i << " : even" << std::endl;
} else {
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
Google C++ Style Guide に従ったフォーマットです。
#include <iostream>
namespace Project {
class MyClass {
public:
MyClass(int value) : value_(value) {}
private:
int value_;
};
} // namespace Project
int main() {
for (std::size_t i = 0; i < 10; ++i) {
if (i % 2 == 0) {
std::cout << i << " : even" << std::endl;
} else {
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
Chromium
Chromium coding style に従ったフォーマットです。
ほぼ Google と同じように見えます。
#include <iostream>
namespace Project {
class MyClass {
public:
MyClass(int value) : value_(value) {}
private:
int value_;
};
} // namespace Project
int main() {
for (std::size_t i = 0; i < 10; ++i) {
if (i % 2 == 0) {
std::cout << i << " : even" << std::endl;
} else {
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
Mozilla
Mozilla C++ Coding Style に従ったフォーマットです。
#include <iostream>
namespace Project {
class MyClass
{
public:
MyClass(int value)
: value_(value)
{
}
private:
int value_;
};
}
int
main()
{
for (std::size_t i = 0; i < 10; ++i) {
if (i % 2 == 0) {
std::cout << i << " : even" << std::endl;
} else {
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
WebKit
WebKit C++ Code Style Guidelines に従ったフォーマットです。
#include <iostream>
namespace Project {
class MyClass {
public:
MyClass(int value)
: value_(value)
{
}
private:
int value_;
};
}
int main()
{
for (std::size_t i = 0; i < 10; ++i) {
if (i % 2 == 0) {
std::cout << i << " : even" << std::endl;
} else {
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
Microsoft
Microsoft の C++ Style Guide に従ったフォーマットです。
ただ、該当する Microsoft のページが見当たりません。
#include <iostream>
namespace Project
{
class MyClass
{
public:
MyClass(int value) : value_(value)
{
}
private:
int value_;
};
} // namespace Project
int main()
{
for (std::size_t i = 0; i < 10; ++i)
{
if (i % 2 == 0)
{
std::cout << i << " : even" << std::endl;
}
else
{
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
GNU
GNU Coding Standards に従ったフォーマットです。
#include <iostream>
namespace Project
{
class MyClass
{
public:
MyClass (int value) : value_ (value) {}
private:
int value_;
};
}
int
main ()
{
for (std::size_t i = 0; i < 10; ++i)
{
if (i % 2 == 0)
{
std::cout << i << " : even" << std::endl;
}
else
{
std::cout << i << " : odd" << std::endl;
}
}
return 0;
}
コメント