如何调用C++;main()完成后的函数 我正在开发一个C++工具,它应该对主程序透明。也就是说:如果用户只是将该工具链接到他的程序,该工具将被激活。为此,我需要在main()获得控制之前调用函数a(),在main()完成之后调用函数b()
通过在程序中声明一个全局变量并通过返回代码如何调用C++;main()完成后的函数 我正在开发一个C++工具,它应该对主程序透明。也就是说:如果用户只是将该工具链接到他的程序,该工具将被激活。为此,我需要在main()获得控制之前调用函数a(),在main()完成之后调用函数b(),c++,function,C++,Function,通过在程序中声明一个全局变量并通过返回代码a()对其进行初始化,我可以轻松地完成第一步。i、 e int v = a() ; 但是我找不到在main()完成后调用b()的方法 有人能想出一个方法来做到这一点吗 该工具在windows上运行,但我不想使用任何特定于操作系统的调用 谢谢你,乔治C语言的解决方案: 看看atexit: #include <stdio.h> #include <stdlib.h> #include <unistd.h> void by
a()
对其进行初始化,我可以轻松地完成第一步。i、 e
int v = a() ;
但是我找不到在main()
完成后调用b()
的方法
有人能想出一个方法来做到这一点吗
该工具在windows上运行,但我不想使用任何特定于操作系统的调用
谢谢你,乔治C语言的解决方案: 看看atexit:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void bye(void)
{
printf("That was all, folks\n");
}
int main(void)
{
long a;
int i;
a = sysconf(_SC_ATEXIT_MAX);
printf("ATEXIT_MAX = %ld\n", a);
i = atexit(bye);
if (i != 0) {
fprintf(stderr, "cannot set exit function\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
作废再见(作废)
{
printf(“仅此而已,各位”);
}
内部主(空)
{
长a;
int i;
a=sysconf(_SC_ATEXIT_MAX);
printf(“ATEXIT_MAX=%ld\n”,a);
i=atexit(再见);
如果(i!=0){
fprintf(stderr,“无法设置退出函数\n”);
退出(退出失败);
}
退出(退出成功);
}
但是,这仍然意味着您可以访问main,并且可以添加atexit调用。如果您无法访问main,并且无法添加此函数调用,我认为没有任何选项
编辑:
C++中的解决方案:
#include <iostream>
#include <cstdlib>
void atexit_handler_1()
{
std::cout << "at exit #1\n";
}
void atexit_handler_2()
{
std::cout << "at exit #2\n";
}
int main()
{
const int result_1 = std::atexit(atexit_handler_1);
const int result_2 = std::atexit(atexit_handler_2);
if ((result_1 != 0) or (result_2 != 0)) {
std::cerr << "Registration failed\n";
return EXIT_FAILURE;
}
std::cout << "returning from main\n";
return EXIT_SUCCESS;
}
#包括
#包括
void atexit_handler_1()
{
std::cout如果您愿意使用单个编译器和非标准C/C++,那么GCC的\uuuu属性(构造函数))
和\uu属性(析构函数))
可能会有用:
#include <stdio.h>
void __attribute__((constructor)) ctor()
{
printf("Before main()\n");
}
void __attribute__((destructor)) dtor()
{
printf("After main()\n");
}
int main()
{
printf("main()\n");
return 0;
}
使用RAII,在构造函数/析构函数中调用a和b
class MyObj {
MyObj()
{
a();
};
~MyObj()
{
b();
};
};
然后在main()范围之外有一个MyObj实例
有些事情需要注意
- 这是BOG标准C++,将在任何平台上工作/<
- 只需将MyObj实例放在单独的编译单元中,就可以在不更改任何现有源代码的情况下使用它
- 虽然它将在main()之前和之后运行,但在main()之外构造的任何其他对象也将在此时运行。而且您几乎无法控制顺序
您的对象的构造/破坏等
在main
之前没有构造任何全局变量并在之后进行析构函数吗?我做了一个测试struct
,其构造函数在main
之前调用,析构函数在之后调用
#include <iostream>
struct Test
{
Test() { std::cout << "Before main..." << std::endl; }
~Test() { std::cout << "After main..." << std::endl; }
};
Test test;
int main()
{
std::cout << "Returning now..." << std::endl;
return 0;
}
#包括
结构测试
{
测试(){STD::CUT< P>替代析构函数,可以使用类似的方式使用<代码> ATEXIT()/CUT>——在C++中,不需要访问<代码>主()/Cux>登记<代码> ATS/<代码>。您可以在< <代码>()> < /代码>中执行该操作,例如:
void b(void) {
std::cout << "Exiting.\n";
}
int a(void) {
std::cout << "Starting.\n";
atexit(b);
return 0;
}
// global in your module
int i = a();
void b(void){
std::你能在调用函数的main中创建一个对象吗?b
在它的析构函数中不是为你创建的吗?让你的全局变量类类型并把代码放在它的析构函数中,你需要b
只在main
返回时被调用,或者如果程序exit
s,你也需要它吗?正如OP提到的,该工具在Windows上运行一个链接到Windows版本的代码> ATSUCT/<代码>可能是合适的:问题是标记C++,但是这个答案是在C.,而不是有很大的不同。@ CalthFrac或CppReference实际上不是官方文档;官方文档是ISO标准14882。@ Biffe: C++示例是以“我只是将官方文档[sic]中的示例粘贴到这里。”不,我无法提供指向ISO 14882文档的链接。它受版权保护,不受(法律)保护在线可用。您可以将实例作为MyObj
的静态成员,并将类中的所有内容都设置为私有,如果每个函数只调用一次很重要的话。@Biffen是的。这是有意义的。我只显式地将对象放在main()之前让例子简单明了。谢谢!这是我的问题最简单的解决办法。为什么我自己没有想到析构函数……这个问题被标记为C++,为什么你会求助于非标准的和不可移植的解决方案?
#include <iostream>
struct Test
{
Test() { std::cout << "Before main..." << std::endl; }
~Test() { std::cout << "After main..." << std::endl; }
};
Test test;
int main()
{
std::cout << "Returning now..." << std::endl;
return 0;
}
void b(void) {
std::cout << "Exiting.\n";
}
int a(void) {
std::cout << "Starting.\n";
atexit(b);
return 0;
}
// global in your module
int i = a();