🌵
X macro
概要
リスト構造を作る際に便利なマクロです。
意外に解説がヒットしなかったため、記事にしました。
サンプル
#include <stdio.h>
#define LIST_OF_VALUE \
X(FOO,100) \
X(BAR,200) \
X(BAZ,300)
int main(void){
#define X(name, _) name,
enum idx
{
LIST_OF_VALUE
};
#undef X
#define X(_, value) value,
int value[]
{
LIST_OF_VALUE
};
#undef X
// #を付けると"name"のように文字列として表現される
#define X(name, _) #name,
const char* names[]
{
LIST_OF_VALUE
};
#undef X
printf("name: %s\n", names[1]);
printf("index: %d\n", idx::BAR);
printf("value: %d\n", value[1]);
}
出力
name: BAR
index: 1
value: 200
解説
まずはリストを定義します。
#define LIST_OF_VALUE \
X(FOO,100) \
X(BAR,200) \
X(BAZ,300)
次にリストから任意の値を取り出す処理を定義します。
今回の場合は X(FOO,100)からFOOを取り出していますね。
#define X(name, _) name,
// do something
#undef X
例として、取り出した値を用いたenumを定義します。
#define X(name, _) name,
enum idx
{
LIST_OF_VALUE
};
#undef X
補足
あくまでイメージですが、下記のような処理を想像すると理解しやすいかと思います。
enum idx
{
LIST_OF_VALUE
};
↓
enum idx
{
X(FOO,100) => FOO,
X(BAR,200) => BAR,
X(BAZ,300) => BAZ,
};
↓
enum idx
{
FOO,
BAR,
BAZ,
}
Discussion