const, enumによる定数名は大文字にしない
今まで、「名前付き定数は大文字にする」って勝手に思い込んでいました。事実、そういうプログラムをずっと書いてきました。CODE COMPLETEでもそう言っていました。キリストだって多分そう言っていました。
// マクロ #define MACRO 10; // const修飾子 static const int CONSTANT = 10; // 列挙型 enum ENUMERATED_TYPES { ENUMRATED_ONE, ENUMRATED_TWO, };
この習慣はC言語で#defineによって定数を定義していた時のものです。つまり、プリプロセッサで定義していた時のものです。目的は、プリプロセッサと変数、関数名で、名前の衝突を起こさないためであったようです。
あれ?じゃあconst, enumによる定数名を大文字にしたら、マズくね?
と思ったというお話でございます。
だって、問題は、プリプロセッサで定義された名前が、変数名、関数名を上書きしてしまうことにあるのです。この時、コンパイラ、リンカは何も教えてくれません。じゃあ、定数名を大文字でconstやenumを定義する場合は、その問題が逆に襲い掛かってくるんじゃないの?ということです。
プロプロセッサー定義の名前が衝突した場合、または同じスコープの変数名等が衝突した場合は、警告が発生します。危ないのは、プリプロセッサー定義の名前と、const, enumの定数名が衝突した時に、プログラマーに何も通知されないということです。
例えば
#include "MyConstEnum.h" #include "ThirdPartyMacro.h" int main(void) { char array[ARRAY_SIZE]; ・・・ }
この場合、"MyConstEnum,h"で
static const int ARRAY_SIZE = 320;
"ThirdPartyMacro.h"で
#define ARRAY_SIZE 32
となっていた場合に問題が起きます。main処理ではARRAY_SIZEが"MyConstEnum.h"で定義された320であることを期待しているのですが、実際は"ThirdPartyMacro.h"で定義された32に上書きされてしまいます。こんなことがあるのなら、プリプロセッサ定義の名前の衝突で警告が出た方がマシです。
そのため、const, enumでの定数名は、全て大文字にしない方が良いと思われます。
// マクロ #define MACRO 10; // const修飾子 static const int Constant = 10; // 列挙型 enum Enumrated_Types { Enumrated_One, Enumrated_Two, };
ではでは。