log C ++类方法调用者(函数名,行号)

时间:2017-10-01 04:40:28

标签: c++

我的C ++代码中有一个类与以下类似:

class myClass
{
public:
  void method1(int a, int b, std::string str);
};

其他类可以从myClass实例化一个对象并调用method1。

void caller()
{
    obj1->method1(12, 4, "sample");
}

我想记录myClass的所有调用者(函数名,文件名,行号)。一种可能的解决方案是:

class myClass
{
public:
  method1(int a, int b, std::string str, const char *_function = __builtin_FUNCTION(), const char *_file = __builtin_FILE(), int _line = __builtin_LINE());
};

使用__builtin_xxx作为默认参数。该解决方案有许多缺点:

  1. 这是一个丑陋的解决方案
  2. __ builtin_xxx仅适用于gcc版本> 4.8
  3. 我们必须向method1
  4. 添加三个默认参数
  5. IDE显示自动完成时的默认参数,这些参数并非由用户提供!
  6. 另一种解决方案是使用__LINE____FILE____func__,它与之前的解决方案基本相似。它们不是在函数范围之外定义的,它们应该像这样使用:

    void caller()
    {
        obj1->method1(12, 4, "sample", __func__, __FILE__, __LINE__);
    }
    

    Here是两种解决方案的工作示例。

    当用户在myClass对象上调用method1时,是否有任何更好解决方案来记录调用者。通过更好的解决方案,我特别指的是不通过添加三个参数来改变method1的声明!

2 个答案:

答案 0 :(得分:0)

另一个丑陋的解决方案,但我正在使用......

使用宏自动添加__FILE__ #define Method(param0,param1) Method(param0,param1,__LINE__) ...等。把事情变成了参数。

例如

{{1}}

它有很多问题,如果你希望宏作为普通函数工作,你必须做很多事情,它仍然可能无效。

我用它来帮助我记录错误。

答案 1 :(得分:0)

看起来像是Print the file name, line number and function name of a calling function - C Prog

的副本
I'd pass the data to the function through parameters (maybe get the help of a macro)

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
And to call them

info(__FILE__, __LINE__, __func__, ...);
debug(__FILE__, __LINE__, __func__, ...);
error(__FILE__, __LINE__, __func__, ...);
Note: __func__ is C99; gcc, in mode C89 has __FUNCTION__