Cプリプロセッサマクロ挙動クイズ

#define STR(a) #a
#define STR_(a) STR(a)
#define CONCAT(a,b) a##b
#define CONCAT_(a,b) CONCAT(a,b)
#define M1(a) STR(CONCAT(a, __LINE__))
#define M2(a) STR_(CONCAT(a, __LINE__))
#define M3(a) STR(CONCAT_(a, __LINE__))
#define M4(a) STR_(CONCAT_(a, __LINE__))

int main() {
  puts(M1(a));
  puts(M2(b));
  puts(M3(c));
  puts(M4(d));
}

以上のような foo.c があるとして、

$ clang -E foo.c | sed '/^#/d'

するとどうなるか。つまり、プリプロセッサを通すとどうなるか。

答え

int main() {
  puts("CONCAT(a, __LINE__)");
  puts("b__LINE__");
  puts("CONCAT_(c, __LINE__)");
  puts("d14");
}