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

时间:2019-05-15 19:30:55

标签: c++ debugging macros c-preprocessor

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

class A {
    void method();
}

假设我需要找到直接从C ++调用此方法的位置(即gdb和company被淘汰,因此抛出异常)

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

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

但是,这将打印当前方法的文件和行,而不是打印该方法所在的文件和行。

如果我们的代码不是OOP程序,则可以转换一次:

void method();

收件人:

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

以上方法之所以有效,是因为方法不带任何参数,因此处理器可以轻松地将方法的所有实例更改为我们的新调试代码。

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

即使仅A类实现了method(),如果函数采用任何参数,现在我们也会遇到一个新问题:method(int i)将需要替换正则表达式,因为我们不了解变量名称沉入方法中。即模式a.method(variable);无法通过常量定义静态匹配,我们需要匹配正则表达式。

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

编辑:

标记为重复的问题是从2010年开始的,我认为有必要将此问题公开,因为9年的时间似乎足以为该问题提供新的可能答案。

例如std::experimental::source_location不在问题中。

我希望这个问题再次出现

1 个答案:

答案 0 :(得分:2)

如果您使用的是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();
}