我在叫啥?

Posted

技术标签:

【中文标题】我在叫啥?【英文标题】:What am I calling?我在叫什么? 【发布时间】:2010-05-19 15:54:33 【问题描述】:

有没有办法在 fnc 内部检查这个 fnc 名称是什么?我目前正在研究 LargeInt 类,我已经意识到 oparator> 和 operator 谢谢。

【问题讨论】:

复制:***.com/questions/733056/… 我是什么? youtube.com/watch?v=l_8yPap-k_s 抱歉,忍不住:) 【参考方案1】:

你可以通过__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; 
...

【讨论】:

【参考方案2】:

你似乎真的在问:

“我能知道是哪个函数调用了我吗?”

如果是这样,不,没有内置的方法可以做到这一点,恕我直言,这样做是糟糕的设计。但是,您当然可以相互实现op&lt;op&gt;(以及其他关系运算符):

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 );

等等。

【讨论】:

嗯...inline bool operator&gt;(A a1, A a2) return a2 &lt; a1; 其实你只需要实现 operatorutility 头文件的 rel_ops 命名空间中很容易获得。 @Neil 是的,就在第二秒之前,我想到了 ;) 当然,只是因为!(a1 &lt; a2) &amp;&amp; !(a2 &lt; a1)是真的doesn't mean they are equal。【参考方案3】:

一般来说,必须在交互式调试器中运行。

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

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

【讨论】:

我宁愿不使用 fnc 的名称,也不愿在学习之外接触 Java。呃……【参考方案4】:

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

不过,我认为无论调用谁,您的比较函数都应该能够正常工作。

【讨论】:

【参考方案5】:

将通用代码放入一个新方法中,并使用附加参数来调用它,以区分与operator&lt;operator&gt; 方法的调用。

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);

【讨论】:

以上是关于我在叫啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个方法叫啥:[NSPathStore2 setDelegate:]

一段未知的代码,它叫啥? [关闭]

这个 SQL 选择结构叫啥?

存储为 1 的分数的百分比:这叫啥?

这是众所周知的设计模式吗?它叫啥名字?

有个叫啥fox的搜索引擎全名叫啥?