1

我想知道是否有办法知道一个函数是否是从其他特定函数调用的。

doc(){
foo();
}

bar() {
doc();
}

foo() {
if (bar in the callStack ) { /* do this */}
}

谢谢!!

4

5 回答 5

2

如果不使用许多特定于平台的技巧,您将无法做到这一点。调试器会为您提供该信息,但一般情况下,如果不使用 C++ 中的 ASM 黑客程序,您将无法访问堆栈。

如果你必须这样做,那么你的设计就有问题。您想做什么以便我们可以提供帮助?

于 2012-04-11T23:20:37.840 回答
2

并不是说这是一个好主意或好的设计,但当然您可以使用另一个全局标志,例如:

doc(){
   foo();
}

int inBar = 0;

bar() {
   inBar = 1;
   doc();
   inBar = 0;
}

foo() {
if (inBar) { /* do this */}
}
于 2012-04-11T23:26:57.720 回答
2

您应该使用适合您的编译器的库。

对于 GCC,您可以考虑Backtraces。这个基于 GCC builtins c/c++: call stack v.2

对于 Visual CI,听说过StackWalk64,但我自己从未使用过。

当然,您也可以制作自己的“痕迹”,但我认为这不是您想要的。

于 2012-04-11T23:51:07.503 回答
0

您可以修改 bar() 以在进入时将全局布尔值设置为 true,在退出时设置为 false。在 foo() 中测试 bool 会告诉你是否在 bar() 调用堆栈中。

namespace {
   bool test_bar = false;

}

void bar( ) {
   test_bar = true;

   // do stuff


   test_bar = false;
}

如果您需要以上内容在多线程环境中工作,那么全局 bool 将必须是线程本地的(使用类似 boost::thread_specific_ptr 的东西)这种结构应该只用于跟踪难以捕获的竞争条件调试器,它是一个快速而肮脏的工具,其他用途表明设计不佳。

于 2012-04-11T23:49:16.213 回答
0

如何知道是否从特定函数c ++调用了函数

你不能那样做。但是,您可以向函数添加布尔参数

foo(bool calledFromBar = false) {
     if (calledFromBar) { /* do this */}
}

并从栏设置此标志。然而,这将导致另一个问题——没有什么可以阻止任何其他函数设置标志。

我认为这个(附加问题)可以这样解决:

class BarFlag{
private:
    bool flag;
protected:
    friend void doc();
    BarFlag(bool flag_)
    :flag(flag_){
    }
public:
    inline operator bool() const{
        return flag;
    }
    BarFlag()
    :flag(false){
    }
}

void foo(BarFlag flag = BarFlag()){
     if (flag){/*do it*/}        
}

//somewhere else
void doc(){
   foo(BarFlag(true));
}
于 2012-04-11T23:53:51.487 回答