我想知道是否有办法知道一个函数是否是从其他特定函数调用的。
doc(){
foo();
}
bar() {
doc();
}
foo() {
if (bar in the callStack ) { /* do this */}
}
谢谢!!
如果不使用许多特定于平台的技巧,您将无法做到这一点。调试器会为您提供该信息,但一般情况下,如果不使用 C++ 中的 ASM 黑客程序,您将无法访问堆栈。
如果你必须这样做,那么你的设计就有问题。您想做什么以便我们可以提供帮助?
并不是说这是一个好主意或好的设计,但当然您可以使用另一个全局标志,例如:
doc(){
foo();
}
int inBar = 0;
bar() {
inBar = 1;
doc();
inBar = 0;
}
foo() {
if (inBar) { /* do this */}
}
您应该使用适合您的编译器的库。
对于 GCC,您可以考虑Backtraces。这个基于 GCC builtins c/c++: call stack v.2。
对于 Visual CI,听说过StackWalk64,但我自己从未使用过。
当然,您也可以制作自己的“痕迹”,但我认为这不是您想要的。
您可以修改 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 的东西)这种结构应该只用于跟踪难以捕获的竞争条件调试器,它是一个快速而肮脏的工具,其他用途表明设计不佳。
如何知道是否从特定函数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));
}