LoginSignup
8
8

More than 5 years have passed since last update.

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

Posted at

例えば、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;
}

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

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8