【问题标题】:How to get the file name and a line number of a function call? [duplicate]如何获取函数调用的文件名和行号? [复制]
【发布时间】:2014-01-28 03:13:51
【问题描述】:

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

a.cpp

void A()
{
    B();
}

b.cpp

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

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

【问题讨论】:

  • __FILE____LINE__ 分别。
  • 这不应该是重复的,因为仅仅使用这些宏是不够的,还需要“将函数隐藏在宏后面”(参见接受的答案)这不是唯一可能的答案, C++20 中有另一个答案不适合其他问题(请参阅上面的评论)

标签: c++


【解决方案1】:

通常,您可以通过将函数隐藏在传递__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__)

【讨论】:

  • 您是否故意将文件作为 int 传递?
  • @kazemakase 不,还没喝完咖啡,犯白痴错误:(
  • 如果 B() 函数还有其他参数怎么办?
  • @VitaliusKuchalskis 也将它们添加到宏中并将它们转发到实现函数中
  • 还有……构造函数宏呢?
【解决方案2】:

代码: printf("%s(%d)--:",__FILE__,__LINE__);

参考: http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2018-09-04
    • 2010-11-23
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多