我正在定义一个宏,它评估为一个常量字符串,保存文件名和行号,用于记录目的。
它工作得很好,但我只是无法弄清楚为什么需要 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;
}
这对我来说似乎是一个丑陋的黑客。
有人可以详细解释逐步发生的事情,以便__LINE__
正确地进行字符串化,以及为什么两者都__FILE__ ":" STRINGIFY(__LINE__)
不起作用__FILE__ ":" #__LINE__
?