変数名のプレフィクス
これまでの記事で、コード中の変数名が気になった方も多いのではないでしょうか。
例えば、次のような変数名
m_nSize
「何かの大きさを表す変数であることは "Size" から分かるが、その前の m_n
はいったい何ぞ?」
こうしたプレフィクス (接頭辞) にはちゃんと意味があり、私自身はこれを手掛かりにコードを呼んでいます。
今回は、その役割についてご紹介します。
1. メンバ変数の名前は m_ から始める。
メンバ関数内とローカル変数を一目で識別できるようにするため、メンバ変数の名前を m_
から始めることにしています。
このようなルールを採用していないコードは、
- メンバ変数・ローカル変数の名前が衝突する。
- 関数内で定義されていない変数が「唐突に」出現する
「thisを使って明示すればよい」という意見もありますが、それでは「メンバ関数内ではオブジェクトのメンバを修飾なしで参照できる」という簡潔な記述のためのルールが無意味になってしまいます。
また、Set~ 系の関数でもメンバ変数と引数の名前が衝突しなくなるので便利です。
//「m_ルール」採用 (よさげ) void Box::SetWidth(double dWidth){ m_dWidth =dWidth; } //「m_ルール」不採用 (thisが鬱陶しい。) void Box::SetHeight(double dHeight){ this->dHeight =dHeight; } //「m_ルール」不採用 (アンダースコアだけでは目印として弱い。) void Box::SetDepth(double _dDepth){ dDepthi =_dDepth; } |
このルールには例外もあって、public なメンバ変数、static const なメンバ変数には適用されません。
2. プリミティブ型は、型に応じたプレフィクスを付ける
これはハンガリアン記法として知られているもの。
いろいろと批判も多いようですが、便利なので採用しています。
データ型 | プレフィクス | プレフィクスの由来 |
---|---|---|
配列 | a | array |
bool, boolean, BOOL | b | boolean |
BYTE, byte | by | byte |
char | c | char |
double | d | double precisionloating point |
DWORD (unsigned double) |
dw | doube word |
float | f | floating point |
HANDLE | h | handle |
long | l | long |
ポインタ | lp | long pointer (単純に p でもよいが、なんとなくこちらを採用している。) |
int | n | number |
関数ポインタ | pfn | pointer for function (これだけは lp でなく p を採用。特に理由はない。) |
参照 | r | reference |
short | s | short |
ゼロ終端文字列 | sz | string with zero termination |
WORD | w | word |
このルールにも例外があります。
例えば、ループカウンタとして使用する int 型変数には、i
, j
など単純な名前を使用します。