こいつぁ酷い.
#include <stdio.h> #define STRINGIFY(v) #v #define STRINGIFY2(v) STRINGIFY(v) int main(void) { printf("%s\n", STRINGIFY(__LINE__)); printf("%s\n", STRINGIFY2(__LINE__)); printf("%s\n", STRINGIFY(STRINGIFY2(__LINE__))); // STRINGIFY2(__LINE__) printf("%s\n", STRINGIFY2(STRINGIFY2(__LINE__))); // "10" }
#
で文字列化された時,文字列化の対象はマクロ展開される前の引数の値なので,こんなことになってしまう.展開後の値を文字列化したいならば,STRINGIFY2
のようにワンクッション挟まないといけない.
STRINGIFY(__LINE__)
→ #__LINE__
→ “__LINE__”
STRINGIFY2(__LINE__)
→ STRINGIFY(8)
→ #8
→ “8”