Ryukalice

const, enumによる定数名は大文字にしない

2013-11-12

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

// マクロ
#define MACRO 10;

// const修飾子
static const int CONSTANT = 10;

// 列挙型
enum ENUMERATED_TYPES {
    ENUMRATED_ONE,
    ENUMRATED_TWO,
};

この慣習はC言語で #define によって定数を定義していた時のものです。つまり、プリプロセッサで定義していた時のものです。目的は、プリプロセッサと変数、関数名で、名前の衝突を起こさないためであったようです。つまり、constenum による定数名を大文字にすべきではないのでは?と感じた話です。

問題は、プリプロセッサで定義された名前が、変数名、関数名を上書きしてしまうことにあるのです。この時、コンパイラ、リンカは何も教えてくれません。じゃあ、定数名を大文字で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;

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