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"); }