Posted at

データの追加し忘れをコンパイラに教えてもらう

More than 5 years have passed since last update.

例えば、enum に対して名前をつけて表示するとします。


test.cpp

#include <iostream>


enum {
NAME_1 = 0,
NAME_2,
NAME_3,
NAME_MAX
};

const char *enum_to_str[NAME_MAX] = {
"name1",
"name2",
"name3",
};

void main()
{
using namespace std;
cout << enum_to_str[NAME_1] << endl;
}


この時、もし enum に NAME_4 を増やすとなった場合、enum_to_str にも文字列(name4)を追加しなければならなくなるわけですが、ソースコードがこんな風にひと目で分かるようになっているとも限りません。

もしかすると、全然関係のないソースファイルに enum_to_str があるかもしれません。

仮にそんなところにあった場合、文字列の追加を忘れてしまうかもしれません……。

そんな時に便利なのが static assert + sizeof array。

以下のようにすると、もし仮に enum_to_str に名前を追加を忘れたとしても、コンパイル時にエラーを出して教えてくれます。


test2.cpp

#include <iostream>


#define STATIC_ASSERT(expr) \
typedef char STATIC_ASSERT_TYPE[(expr) ? 1 : -1]

#define SIZEOF_ARRAY(ary)\
(sizeof(ary) / sizeof(ary[0]))

enum {
NAME_1 = 0,
NAME_2,
NAME_3,
NAME_MAX
};

const char *enum_to_str[] = {
"name1",
"name2",
"name3",
};
STATIC_ASSERT(SIZEOF_ARRAY(enum_to_str) == NAME_MAX);

int main()
{
using namespace std;
cout << enum_to_str[NAME_1] << endl;

return 0;
}


まぁ、そもそもコード内にデータを埋め込む事自体云々……という話ではありますが……。