gpt4 book ai didi

C++ 是否可以使用宏从调用它的地方打印类函数?

转载 作者:行者123 更新时间:2023-11-28 01:21:17 25 4
gpt4 key购买 nike

假设我有一个这样的类定义:

class A {
void method();
}

假设我需要找到直接从 C++ 调用此方法的位置(即排除了 gdb 和公司,因此抛出了异常)

人们可以天真地定义以下内容:

class A {
//void method();
void method() { print(__FILE__ + ": " + __LINE__) };
}

然而,这将打印当前方法的文件和行,而不是调用该方法的文件和行。

如果我们的代码不是面向对象的,而是程序化的,一旦可以转换:

void method();

收件人:

#define method() { print(__FILE__ + ": " + __LINE__) };

上面的代码之所以有效,是因为方法不接受任何参数,因此 peprocessor 很容易将方法的所有实例更改为我们新的调试代码。

但这不是很普遍。使用 OOP,我们可以让类 A、B、C 和 D 都覆盖该方法,从而为不相关的类叠印信息。

即使只有 A 类实现了 method() 如果函数接受任何参数,现在我们遇到了一个新问题:method(int i) 需要一个正则表达式被替换,因为我们事先不知道方法中的变量名。即模式 a.method(variable); 不能通过常量定义进行静态匹配,我们需要匹配正则表达式。

有谁知道是否可以欺骗编译器在调用时而不是定义时解析 __FILE____LINE__ 宏?

编辑:

标记为重复的问题是从 2010 年开始的,我认为值得保留这个问题,9 年的时间似乎足以为这个问题提供新的潜在答案。

例如 std::experimental::source_location 没有出现在问题中。

我想重新打开这个问题

最佳答案

如果您使用的是 GCC,这已从 GCC 4.8 中提供:

#include <cstdio>

struct Foo
{
void debug(const char *file=__builtin_FILE(), int line=__builtin_LINE(), const char *function=__builtin_FUNCTION())
{
printf("%s:%d: called from %s\n", file, line, function);
}
};

int main()
{
Foo().debug();
}

关于C++ 是否可以使用宏从调用它的地方打印类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56156441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com