我的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作为默认参数。该解决方案有许多缺点:
另一种解决方案是使用__LINE__
,__FILE__
和__func__
,它与之前的解决方案基本相似。它们不是在函数范围之外定义的,它们应该像这样使用:
void caller()
{
obj1->method1(12, 4, "sample", __func__, __FILE__, __LINE__);
}
Here是两种解决方案的工作示例。
当用户在myClass对象上调用method1时,是否有任何更好解决方案来记录调用者。通过更好的解决方案,我特别指的是不通过添加三个参数来改变method1的声明!
答案 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__