不使用宏确定呼叫线路

发布于 2024-09-29 09:59:07 字数 547 浏览 3 评论 0原文

是否可以在不借助宏的情况下确定调用函数的行号?

考虑这段代码:

#include <iostream>

#define PrintLineWithMacro() \
  std::cout << "Line: " << __LINE__ << std::endl;   // Line 4

void PrintLine()
{
  std::cout << "Line: " << __LINE__ << std::endl;   // Line 8
}

int main(int argc, char **argv)
{
  PrintLine();           // Line 13
  PrintLineWithMacro();  // Line 14
  return 0;
}

它输出以下内容:

Line: 8
Line: 14

我理解为什么每个人都会打印他们所做的事情。我更感兴趣是否可以在不使用宏的情况下模拟宏功能。

Is it possible to determine the line number that calls a function without the aid of a macro?

Consider this code:

#include <iostream>

#define PrintLineWithMacro() \
  std::cout << "Line: " << __LINE__ << std::endl;   // Line 4

void PrintLine()
{
  std::cout << "Line: " << __LINE__ << std::endl;   // Line 8
}

int main(int argc, char **argv)
{
  PrintLine();           // Line 13
  PrintLineWithMacro();  // Line 14
  return 0;
}

which outputs the following:

Line: 8
Line: 14

I understand why each prints what they do. I am more interested if it's possible to mimic the macro function without using a macro.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

霊感 2024-10-06 09:59:07

我会执行以下操作:

#define PrintLine() PrintLine_(__LINE__)

void PrintLine_(int line) {
    std::cout << "Line: " << line << std::endl;
}

我知道这并没有完全删除预处理器,但它确实将大部分逻辑移至实际函数中。

I would do the following:

#define PrintLine() PrintLine_(__LINE__)

void PrintLine_(int line) {
    std::cout << "Line: " << line << std::endl;
}

I know that this doesn't completely remove the preprocessor, but it does move most of the logic into an actual function.

故人的歌 2024-10-06 09:59:07

C++在c++20标准中已经赶上了这个问题。

在 c++20 中,您现在可以这样做:

#include <iostream>
#include <source_location>

void PrintLine(std::source_location location = std::source_location::current())
{
    std::cout << "Line: " << location.line() << std::endl;   // Line 8
}

int main(int argc, char **argv)
{
    PrintLine();           // Line: 11
    PrintLine();           // Line: 12
    return 0;
}

另一个问题是您感兴趣的编译器是否已经赶上了标准。
请注意,该构造在 c++20 之前就已存在,您可以尝试:

#include <experimental/source_location>

C++ has caught up with this question in the c++20 standard.

In c++20 you may now do:

#include <iostream>
#include <source_location>

void PrintLine(std::source_location location = std::source_location::current())
{
    std::cout << "Line: " << location.line() << std::endl;   // Line 8
}

int main(int argc, char **argv)
{
    PrintLine();           // Line: 11
    PrintLine();           // Line: 12
    return 0;
}

Another question is whether the compiler of your interest has caught up with the standard.
Note that the construct was present pre c++20 and you could try:

#include <experimental/source_location>
ぃ双果 2024-10-06 09:59:07

不便于携带。在任何给定的平台上,您基本上可以重新实现调试器的详细信息 - 该信息有效地存储在堆栈中作为返回地址。在某些平台上,您可以使用 backtrace() 函数来获得此类信息。

Not portably. On any given platform, you could basically re-implement the details of a debugger - the information is effectively stored on your stack as the return address. You can get at that kind of thing with the backtrace() function on some platforms.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文