# とか ## とか

Linuxカーネルのソースを見ていて、こんな書き方ができるんだ、と。
マクロ限定だけれど、# は引数を文字列に変換し、 ## は識別子を結合する。

# の例
#include <stdio.h>

#define PUT(x) printf(#x)

int main(int argc, char *argv[])
{
    PUT(hello world\n);
}

これを実行すると

hello world

となる。

## の例
#include <stdio.h>

#define PUT(x) printf(str_##x)

int main(int argc, char *argv[])
{
    char *str_hello = "hello world\n";

    PUT(hello);
}

これを実行すると

hello world

となる。