🌵

X macro

2024/04/02に公開

概要

リスト構造を作る際に便利なマクロです。
意外に解説がヒットしなかったため、記事にしました。

サンプル

#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