如何检测正确的函数调用对

ber*_*erk 5 c c++

我正在寻找一种能够以嵌套方式检测有序函数调用对的工具,如下所示:

f()   // depth 0
   f()  //depth 1
   g()
g()
Run Code Online (Sandbox Code Playgroud)

在每个调用深度处f()必须有一个g()形成函数调用对的调用.这在关键部分进入和退出时尤其重要.

Jam*_*lis 11

在C++中,一种选择是,在两个电话换到f()g()在一个类的构造函数和析构函数和仅通过实例化类的实例调用这些函数.例如,

struct FAndGCaller
{
    FAndGCaller() { f(); }
    ~FAndGCaller() { g(); }
};
Run Code Online (Sandbox Code Playgroud)

然后可以在任何范围块中使用它,如下所示:

{
    FAndGCaller call_f_then_later_g; // calls f()

} // calls g()
Run Code Online (Sandbox Code Playgroud)

显然,在实际的代码,你会希望更适当命名的东西,而且通常会简单地想拥有的内容f(),并g()在构造函数和析构函数体,而不是独立的功能.

范围界限资源管理(SBRM,或更常见的资源获取是初始化,RAII)的这种习惯用法非常普遍.