我只是做了一个傻瓜:我想跟踪一个进程的执行,为了做到这一点,我写了一个函数trace(),其中包含以下代码行:
trace()
printf("%s[%s:%d], %s\n", __FUNCTION__, __FILE__, __LINE__, s_message);
字符串我希望看到我在哪个函数中,什么文件以及该文件中的哪一行,但我只看到了我编写trace()函数的文件的信息。有没有可能,有没有一些#define之类的东西,告诉C编译器从调用函数的父函数中获取上面提到的宏?
#define
relj7zay1#
您需要将其 Package 在宏中,例如:
void _trace(char const *function, char const *file, long line, char const *message) { printf("%s[%s:%ld], %s\n", function, file, line, message); } #define trace(message) _trace(__FUNCTION__, __FILE__, __LINE__, (message))
字符串
vqlkdk9b2#
正如其他人所说的,你应该有一个宏来完成这个任务。这样做的原因是所有3个使用的宏在编译的预处理阶段都会被扩展,当遇到它们时,它们会被相应的信息替换。这就是为什么你的实际输出是在trace()实现的地方。您可以更改当前的trace()实现,以接收const char *的函数名、文件和行。然后,有一个宏,比如mTrace,它扩展到调用初始跟踪函数,精确地传递__FUNCTION__,__FILE__, __LINE__。当然,您的mTrace可以获取另一个参数,即您想要添加的实际消息,并将其进一步传递给trace()。
const char *
mTrace
__FUNCTION__,__FILE__, __LINE__
2条答案
按热度按时间relj7zay1#
您需要将其 Package 在宏中,例如:
字符串
vqlkdk9b2#
正如其他人所说的,你应该有一个宏来完成这个任务。这样做的原因是所有3个使用的宏在编译的预处理阶段都会被扩展,当遇到它们时,它们会被相应的信息替换。这就是为什么你的实际输出是在
trace()
实现的地方。您可以更改当前的
trace()
实现,以接收const char *
的函数名、文件和行。然后,有一个宏,比如mTrace
,它扩展到调用初始跟踪函数,精确地传递__FUNCTION__,__FILE__, __LINE__
。当然,您的mTrace
可以获取另一个参数,即您想要添加的实际消息,并将其进一步传递给trace()
。