我在说什么?

时间:2010-05-19 15:54:34

标签: c++

有没有办法检查fnc里面这个fnc名称是什么?我目前正在使用LargeInt类,我已经意识到oparator的代码>和运算符<几乎完全一样,所以我想知道操作员打电话给我并作出相应的反应 谢谢。

5 个答案:

答案 0 :(得分:6)

您可以传递__func__(C99)或__FUNCTION____PRETTY_FUNCTION__(非标准)。

如果调用者没有提供__func__(想象一个带有所有符号被剥离的内联函数),则没有标准且可靠的方法来查找函数调用者的名称。

但是如果困扰你的话,最好将公共部分重构成一个独立的功能。

int compare(const T& other) const { ... }

bool operator< (const T& other) const { return compare(other) < 0; }
bool operator> (const T& other) const { return compare(other) > 0; }
...

答案 1 :(得分:1)

通常,不是没有在交互式调试器中运行。

编译和链接的C ++程序不一定包含所有符号信息,因此如果您刚刚在堆栈中的某个位置断开并且能够跟踪所有调用函数的地址,那么您将很难将这些地址转换回来有意义的名字。这与Java有很大不同,Java可以通过程序报告方法名称。

另一方面,交互式调试器将能够为您建立连接。

答案 2 :(得分:1)

你好像在问:

“我可以知道哪个函数叫我?”

如果是这样,不,没有内置的方法这样做,恕我直言,这样做是不好的设计。但是,您当然可以相互实现op<op>(以及其他关系运算符):

bool operator < ( A a1, A a2 ) {
    return a1.x < a2.x;     // base implementation
}

bool operator==( A a1, A a2 ) {
    return !(a1 < a2) && !(a2 < a1);
}

bool operator>( A a1, A a2 ) {
    return !(a1 == a2) && ! (a1 < a2 );
}

等等。

答案 3 :(得分:0)

没有标准或可移植的解决方案,但如果您在Linux上进行开发,则可能对backtrace()感兴趣。

尽管如此,我认为你的比较函数应该是一样的,无论它是谁调用它。

答案 4 :(得分:0)

将公共代码放入新方法中,并使用其他参数来区分调用operator<operator>方法。

bool LargeInt::almost_identical(LargeInt const &rhs, enum Caller caller)
{
    ...alleged almost identical code...
}

bool LargeInt::operator>(LargeInt const &rhs)
{
    return almost_identical(rhs, CALLER_GT);
}

bool LargeInt::operator<(LargeInt const &rhs)
{
    return almost_identical(rhs, CALLER_LT);
}