如何找到父函数的__FUNCTION__、__LINE__和__FILE__?

Posted

技术标签:

【中文标题】如何找到父函数的__FUNCTION__、__LINE__和__FILE__?【英文标题】:How to find __FUNCTION__, __LINE__ and __FILE__ of parent function? 【发布时间】:2017-02-09 11:18:08 【问题描述】:

我只是自欺欺人:我想跟踪一个进程的执行,为了做到这一点,我写了一个函数trace(),其中包含以下代码行:

printf("%s[%s:%d], %s\n", __FUNCTION__, __FILE__, __LINE__, s_message);

我希望看到我在哪个函数中,哪个文件以及该文件中的哪一行,但我只是看到了我编写 trace() 函数的文件的信息。

是否有可能,有一些 #define 左右,告诉 C 编译器从调用函数的父级获取提到的宏?

【问题讨论】:

trace() 设为宏。 trace 设为宏将是显而易见的解决方案。如果您不知道如何,请阅读宏的工作原理和定义。不要垃圾邮件标签! C++ 不是 C! 相关:***.com/a/18658873/694576 顺便说一句,C 标准所预见的正确拼写是__func__ 【参考方案1】:

你需要将它包装在一个宏中,例如:

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))

【讨论】:

这是宏真正重要的用途之一。 由于在某些情况下__LINE__ 可以扩展为long,因此line 参数的类型应为long,格式应为"%ld" @JensGustedt:好点,已编辑。我想如果int 是 16 位,请记住这一点。尤其是生成的代码可以很容易地达到每个文件 32k 的位置。我想它也可以做成unsigned,实际上。【参考方案2】:

正如其他人所说,你应该有一个宏。 原因是3个用到的宏都是在编译的预处理阶段展开的,遇到的时候会被相应的信息代替。这就是您的实际输出是实现trace() 的原因。

您可以将当前的trace() 实现更改为接收const char * 的函数名称、文件和行。然后,有一个宏,比如mTrace,扩展为调用初始跟踪函数,正好传递__FUNCTION__,__FILE__, __LINE__。当然,您的mTrace 可以获取另一个参数,即您要添加的实际消息,并将其进一步传递给trace()

【讨论】:

以上是关于如何找到父函数的__FUNCTION__、__LINE__和__FILE__?的主要内容,如果未能解决你的问题,请参考以下文章

typescript继承 __extends = (this && this.__extends) || (function () { 代码解读

H5_0038:父元素有touch事件,子元素有点击事件,如何实现点击事件

在LUA中-在_G中找到了“函数”类型的变量,如何将参数传递给它

是否有NSLog的Swift替代方案(@“%s”,__ PRETTY_FUNCTION__)

如何评估 MySQL 存储的_function_ 中的简单数学公式?

python - 构造函数