使用特定格式输出从main间接调用函数

时间:2013-11-04 13:53:28

标签: c++ function

以下是我的计划。

  void fun1(void);
  int main(int argc, char *argv[])
  {
    cout<<"In main"<<endl;
    atexit(fun1);              //atexit calls the function at the end of main
    cout<<"Exit main"<<endl;
    return 0;
  }
  void fun1(void)
  {
    cout<<"fun1 executed"<<endl;
  }

输出

 In main
 Exit main
 fun1 executed

但我打算输出如下:

 In main
 fun1 executed
 Exit main

我不想直接调用“fun1”函数或使用任何其他函数调用我的函数“fun1”。

有什么方法可以实现这个输出吗?我们非常欢迎任何帮助。

4 个答案:

答案 0 :(得分:2)

否。

只有atexit和静态对象破坏“自己”发生,从main返回后都会发生这两件事。

这是有道理的,当你想到它时:main期间应该发生的事情应该写在main中。如果需要在给定时间调用函数,请将其写入程序。这就是你编写程序的原因。 main适用于您的计划。


可能是因为“技巧”或“黑客”会让你从我的团队中被解雇。

答案 1 :(得分:0)

以下是使用范围的黑客攻击:

#include <iostream>

class call_on_destructed {
private:
    void (*m_callee)();
public:
    call_on_destructed(void (*callee)()): m_callee(callee) {}
    ~call_on_destructed() {
        m_callee();
    }
};

void fun() {
    std::cout << "fun\n";
}

int main() {
    {
        call_on_destructed c(&fun);
        std::cout << "In main" << std::endl;
    }
    std::cout<<"Exit main"<<std::endl;
}

输出:

In main
fun
Exit main

范围结束导致类析构函数被调用,而类析构函数又调用在类中注册的fun函数。

答案 2 :(得分:-1)

你想要这样的东西:

  void fun1(void)
  {
    std::cout << "fun1 executed" << std::endl;
  }

  void call(void f())
  {
      f();
  }

  int main(int argc, char *argv[])
  {
    std::cout << "In main" << std::endl;
    call(fun1);              //call calls the given function directly
    std::cout << "Exit main" << std::endl;
    return 0;
  }

答案 3 :(得分:-1)

显然,如果你想让你的功能被执行,有些东西会被称之为!也就是说,在不调用函数的情况下调用函数将不起作用。 atexit()也只是调用你的函数:你注册最终被调用的东西。

从它的声音中,你的作业要求关闭一个功能对象并让该功能调用你的功能。例如,您可以使用函数调用者:

template <typename F>
void caller(F f) {
    f();
}

int main() {
    std::cout << "entering main\n";
    caller(fun1);
    std::cout << "exiting main()\n";
}

显然,caller()会调用fun1,但不提及该名称。