涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

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,
};


ではでは。