在c++中访问返回语句后,在函数中执行代码

Execution of code in a function after the return statement has been accessed in c++

本文关键字:代码 函数 执行 语句 c++ 访问 返回      更新时间:2023-10-16

我有以下功能:

Class Image {
    IplImage* createImage( char* name )
    {
        IplImage* img = cvLoadImage( name );
        return img;
        ...
    }
}
int main() {
    IplImage* newimg = createImage( "somepath" );
    return 0;
}

执行createImage函数后,我想知道是否有方法在访问return语句并用img变量的内容填充newimg之后执行一些代码。

上面的代码是我想要实现的一个示例。我的主要问题是:即使在返回语句到达之后,是否有任何方法可以执行函数中的代码?

return指令正是这样做的,它会立即返回。之后的事情都不会被执行。

因此,如果您希望此函数执行其他操作,则必须在函数return:之前添加这些任务的代码

IplImage* createImage( char* name )
{
    IplImage* img = cvLoadImage( name );
    // test if image was loaded and/or
    // do whatever else you feel you need to do
    // before:
    return img;
}

请记住,createImage()的功能应该很简单,并按照宣传的那样执行:创建图像。

是的,您可以创建一个本地对象,该对象将在其析构函数期间执行代码。这里有一个例子:

class X
{
    X(){}
    ~X()
    {
        std::cout << "hello" << std::endl;
    }
};
int a_function()
{
    X x;
    int a = some_calculation();
    return a;
}

例如,这种技术与作用域指针一起使用。

要回答这个问题,否,在初始化newimg之后不可能执行代码(至少不在createImage函数中)。这是你能得到的最接近的:

struct post_return_guard{
  ~post_return_guard(){
     // whatever you want HERE
  }
};
IplImage* createImage(std::string const& name){
  post_return_guard g;
  IplImage* img = cvLoadImage(name.c_str());
  return img;
  // destructor of 'g' called, code executed.
}

C/C++中任何函数/方法的(无条件)返回语句后的每一位auf代码都是不可访问的代码,永远不会被访问/运行!

这就是您应该做的。

Class Image {
    IplImage* createImage( char* name )
    {
        IplImage* img = cvLoadImage( name );
        return img;
    }
}
void doMoreStuff(){
        ...
}
int main() {
    IplImage* newimg = createImage( "somepath" );
    doMoreStuff();
    return 0;
}

这并不难;只返回一个代理对象(而不是指针)其在其析构函数中执行代码。既然你在期待一个指针作为回报,代理对象也应该隐式转换为指针。

话虽如此:你为什么要这样做?你想做什么这在createImage中是无法完成的,从你打电话的那一刻起cvLoadImage和你回来的那一刻?