以下是我的计划。
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”。
有什么方法可以实现这个输出吗?我们非常欢迎任何帮助。
答案 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
,但不提及该名称。