如何获取函数调用的文件名和行号?

6

我有两个在不同源文件中的函数:

a.cpp

void A()
{
    B();
}

b.cpp

void B()
{
    std::cout << "B() called from file: " << ??? << " line: " << ??? << std::endl;
}

如何获取调用的文件名和行号?


3
__FILE____LINE__ 分别表示文件名和行号。 - David G
对于C++20:https://dev59.com/BXE85IYBdhLWcg3wSxgv#58556021 - user202729
这不应该是一个重复的问题,因为仅仅使用那些宏是不够的,还需要“在宏后面隐藏函数”(请参见被接受的答案)。而且这不是唯一可能的答案,在C++20中还有另一个答案,这对于其他问题来说并不合适(请参见上面的评论)。 - user202729
2个回答

15

通常情况下,您可以通过在宏调用后隐藏函数并传递__FILE____LINE__值来自动执行此操作。

void _B(const char* file, int line) { ... } 
#define B() _B(__FILE__, __LINE__)

尽管如此,这并不是一种万无一失的解决方案。开发人员可以直接调用_B,或者在生成的代码、汇编等中调用_B......这些情况下可能没有有意义的文件/行号。

OP要求给出带参数的示例。

void _C(int p1, char p2, const char* file, int line) { ... } 
#define C(p1, p2) _C(p1, p2, __FILE__, __LINE__)

你是故意将文件传递为整数吗? - MB-F
1
@kazemakase 不好意思,我还没喝完咖啡,犯了一些低级错误 :( - JaredPar
如果B()函数有其他参数怎么办? - Qualphey
@VitaliusKuchalskis 不确定你的意思是什么。你能详细说明一下吗? - JaredPar
我的意思是,如果函数B()是类B的构造函数呢? - Qualphey
显示剩余3条评论

0

我不明白你的意思。 - Ingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接