C препроцессор stringification странность

Я определяю макрос, который оценивает в постоянную строку, удерживая имя файла и номер строки для целей регистрации.

Он работает нормально, но я просто не могу понять, почему 2 дополнительных макросов необходимы - STRINGIFY и ToString , когда интуиция подсказывает просто __ FILE__ ":" # __Line __ .

#include <stdio.h>

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define THIS_ORIGIN (__FILE__ ":" TOSTRING(__LINE__))

int main (void) {
  /* correctly prints "test.c:9" */
  printf("%s", THIS_ORIGIN);
  return 0;
}

Это просто кажется уродливым взлом для меня.

Может кто-нибудь объяснить в деталях, что происходит поэтапно, так что __ ЛИНИЯ __ является строковой правильно, и поэтому ни один из __ FILE__ ":" STRINGIFY (__ ЛИНИЯ __) и __ FILE__ " : «#__ Line __ работает?

5
задан Brian Tompsett - 汤莱恩 31 March 2016 в 20:27
поделиться