【发布时间】:2017-10-01 04:40:27
【问题描述】:
我的 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 作为默认参数。该解决方案有多个缺点:
- 这是一个丑陋的解决方案
- __builtin_xxx 仅适用于 gcc 版本 > 4.8
- 我们要给method1添加三个默认参数
- IDE 在自动完成时显示默认参数,这些参数并非由用户提供!
另一个解决方案是使用__LINE__、__FILE__ 和__func__,这与之前的解决方案基本非常相似。它们没有在函数范围之外定义,它们应该像这样使用:
void caller()
{
obj1->method1(12, 4, "sample", __func__, __FILE__, __LINE__);
}
Here 是这两种解决方案的工作示例。
当用户在 myClass 对象上调用 method1 时,是否有任何更好的 解决方案来记录调用者。通过更好的解决方案,我的意思是不要通过添加另外三个参数来更改方法 1 的声明!
【问题讨论】:
-
您可能想更清楚地说明...因为宏解决方案不会牺牲性能... IDE 的问题实际上是 IDE 问题而不是 C++ 问题。你说什么?
-
如果不关心性能,可以使用调用栈:stackoverflow.com/questions/3899870/print-call-stack-in-c-or-c
标签: c++