Я определяю макрос, который оценивает в постоянную строку, удерживая имя файла и номер строки для целей регистрации.
Он работает нормально, но я просто не могу понять, почему 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 __
работает?