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


はじめに

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

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

Cpp Core Guidelines

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

対象 表記
ファイル名 すべて小文字でアンダースコアかダッシュ区切り 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://fuchsia.dev/fuchsia-src/development/languages/c-cpp/cpp-style

https://www.tensorflow.org/community/contribute/code_style

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

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

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

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

WebKit 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

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

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

おわりに

調べるとほかにもいろいろ見つかります。
ROS C++ スタイルガイドとか、LLVM Coding Standardsとか、似ているけど少し違ったりします。

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

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