例えば、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;
}
まぁ、そもそもコード内にデータを埋め込む事自体云々……という話ではありますが……。