今まで、「名前付き定数は大文字にする」って勝手に思い込んでいました。事実、そういうプログラムをずっと書いてきました。CODE COMPLETEでもそう言っていました。キリストだって多分そう言っていました。

#define MACRO 10 ; 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 ; static const int Constant = 10 ; enum Enumrated_Types { Enumrated_One, Enumrated_Two, };



ではでは。