Cで「__LINE__」をコンパイル時に文字列化する

こいつぁ酷い.

#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"
}

wandbox

#で文字列化された時,文字列化の対象はマクロ展開される前の引数の値なので,こんなことになってしまう.展開後の値を文字列化したいならば,STRINGIFY2のようにワンクッション挟まないといけない.

  • STRINGIFY(__LINE__)#__LINE__“__LINE__”
  • STRINGIFY2(__LINE__)STRINGIFY(8)#8“8”
  • Last modified: 6 weeks ago