Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调用C++;main()完成后的函数 我正在开发一个C++工具,它应该对主程序透明。也就是说:如果用户只是将该工具链接到他的程序,该工具将被激活。为此,我需要在main()获得控制之前调用函数a(),在main()完成之后调用函数b()_C++_Function - Fatal编程技术网

如何调用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++中的解决方案:

Stgest:从STD中有一个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();