C++言語の命名規則をいくつか調べる


# はじめに

C++で名前のつけ方に迷ったので、どんなものがあるか調べてみました。
見つけたものだけ書いているので、あまり包括的な内容にはなっていません。

クラス名を大文字で始めるとかのスタイル部分の話だけ抜き出しました。
snake_case、camelCase、PascalCaseの名前で書いていますが、Microsoftのガイドライン以外ではあまりこの表現は使われていないようです。


# Cpp Core Guidelines

[https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)。

| 対象 | 表記 | 例 |
| ---- | ---- | ---- |
| define | SNAKE_CASE | SIZE |
| すべて | snake_case(推奨)、一貫性があればいい | my_map |

C and C++ styleとC++ Standard Libraryでは、snake_caseを使用しています。


# Google C++ スタイルガイド

[https://ttsuki.github.io/styleguide/cppguide.ja.html](https://ttsuki.github.io/styleguide/cppguide.ja.html)。

| 対象 | 表記 | 例 |
| ---- | ---- | ---- |
| ファイル名 | すべて小文字でアンダースコアかダッシュ区切り | my_useful_class.cc |
| ファイル | .ccで終わる | - |
| ヘッダファイル | .hで終わる | - |
| includeされることが目的のファイル | .incで終わる | - |
| 型(クラス、型のエイリアス、列挙型、テンプレート引数)、関数 | PascalCase | class UrlTable; |
| 変数 | snake_case | string table_name; |
| クラスのメンバー変数(構造体は含まない) | 末尾に_を付ける | string table_name_; |
| 関数 | PascalCase | AddTableEntry() |
| 定数 | 先頭にkを付けたcamelCase、大文字にできない場合は_を付けてもよい | const int kAndroid8_0_0 = 24; |
| namespace | すべて小文字 | websearch::index |
| 列挙型の個々の値 | 定数(kEnumName)と同じ、マクロ(ENUM_NAME)と同じでもよい | kOK |
| define | SNAKE_CASE | #define ROUND(x) |
| 既存のCやC++のエンティティと類似したもの | 既存の命名規則に従ってもよい | bigopen() |


## Google C++ スタイルガイドを参照しているもの

Chromium、FUCHSIA、TensorFlowは、Google C++ スタイルガイド参照になっています。

[https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++.md](https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++.md)。

[https://fuchsia.dev/fuchsia-src/development/languages/c-cpp/cpp-style](https://fuchsia.dev/fuchsia-src/development/languages/c-cpp/cpp-style)。

[https://www.tensorflow.org/community/contribute/code_style](https://www.tensorflow.org/community/contribute/code_style)。


# Microsoft(.NET) 名前付けのガイドライン

[https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/naming-guidelines](https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/naming-guidelines)。

| 対象 | 表記 | 例 |
| ---- | ---- | ---- |
| クラス、構造体、メソッド | PascalCase | public class String |
| パラメーター | camelCase | public static int ToInt32(string value); |

C++でも.NETを参照するようになっています。
ローカル変数などはガイドラインの対象外。


## COM Structured Storage SampleのCoding Style Conventions

[https://docs.microsoft.com/en-us/windows/win32/stg/coding-style-conventions](https://docs.microsoft.com/en-us/windows/win32/stg/coding-style-conventions)。

| 対象 | 表記 | 例 |
| ---- | ---- | ---- |
| 変数 | ハンガリアンを使う | pszMyString |
| メンバー変数 | m_で始める | m_pszMyString |
| グローバル変数 | g_で始める | - |
| クラス | Cで始める | CMyClass |

Win32プログラミングにおける一般的なコーディング手法と書いてあります。
Microsoftのガイドラインに書いてありますが、現在は、ハンガリアンは非推奨。


# WebKit Code Style Guidelines

[https://webkit.org/code-style-guidelines/](https://webkit.org/code-style-guidelines/)。

| 対象 | 表記 | 例 |
| ---- | ---- | ---- |
| クラス、構造体、namespace | PascalCase | struct Data; |
| 変数、関数 | camelCase | size_t bufferSize; |
| staticメンバ変数 | s_で始める | - |
| static以外のメンバ変数 | m_で始める | short m_length; |
| bool変数 | is,didのような単語で始める | bool isValid; |
| define | SNAKE_CASE | - |
| 関数を呼ぶマクロ | 関数と同じ | - |

Javaに近い。
いい例と悪い例が書いてあるので、とても見やすいです。


# GCC C++ Coding Conventions

[https://gcc.gnu.org/codingconventions.html](https://gcc.gnu.org/codingconventions.html)。

| 対象 | 表記 | 例 |
| ---- | ---- | ---- |
| define | SNAKE_CASE | - |
| それ以外 | snake_case | - |
| テンプレート引数 | PascalCase | - |
| メンバ変数 | m_で始める(推奨) | - |
| staticメンバ変数 | s_で始める(推奨) | - |

C言語に近いので、Cpp Core Guidelinesに近い規約になっています。


# おわりに

調べるとほかにもいろいろ見つかります。
[ROS C++ スタイルガイド](http://wiki.ros.org/ja/CppStyleGuide)とか、[LLVM Coding Standards](https://llvm.org/docs/CodingStandards.html)とか、似ているけど少し違ったりします。

英語が多いですが、規約やガイドの内容は命名のスタイルだけでなく、どういうコードにしたらいいかなども書いてあるので、見てみるといいかもしれません。

英語部分など、読み間違えていたら教えてください。