関数が他の特定の関数から呼び出されたかどうかを知る方法があるかどうか疑問に思っていました。
doc(){
foo();
}
bar() {
doc();
}
foo() {
if (bar in the callStack ) { /* do this */}
}
ありがとう!!
それが良いアイデアや良いデザインであるというわけではありませんが、もちろん、次のような別のグローバルフラグを使用することもできます。
doc(){
foo();
}
int inBar = 0;
bar() {
inBar = 1;
doc();
inBar = 0;
}
foo() {
if (inBar) { /* do this */}
}
多くのプラットフォーム固有のハックを使用しないと、これを行うことはできません。デバッガーはその情報を提供しますが、一般に、C++ で ASM ハッカーを使用しないとスタックにアクセスできません。
そうしなければならない場合は、設計に何か問題があります。私たちが助けることができるように、あなたは何をしようとしていますか?
コンパイラに適したライブラリを使用する必要があります。
GCC の場合、 Backtracesを考えることができます。これは GCC ビルトインc/c++: call stack v.2に基づいています。
Visual CI の場合、 StackWalk64について聞いたことがありますが、自分で使用したことはありません。
もちろん、独自の「トレース」を作成することもできますが、それはあなたが望むものではないと思います。
bar() を変更して、開始時にグローバル bool を 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));
}