如何在main()完成后调用C++函数

Geo*_* T. 4 c++ function

我正在开发一个应该对主程序透明的C++工具.即:如果用户只是将工具链接到他的程序,则该工具将被激活.为此我需要在完成控制和函数a()之前调用两个函数function .main()b()main()

我可以通过在程序中声明一个全局变量并通过返回代码初始化来轻松完成a().即

int v = a() ;
Run Code Online (Sandbox Code Playgroud)

但是b()main()完成后我找不到打电话的方法?

有没有人能想到办法做到这一点?

该工具在Windows上运行,但我宁愿不使用任何特定于操作系统的调用.

谢谢你,乔治

Rod*_*ddy 9

使用RAII,在构造函数/析构函数中调用a和b.

class MyObj {
MyObj()
  {
   a();
  };
~MyObj()
  {
    b();
  };
};
Run Code Online (Sandbox Code Playgroud)

然后在main()范围之外只有一个MyObj实例

MyObj obj;

main()
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

有些事情需要注意.

  • 这是bog标准的C++,可以在任何平台上运行
  • 您可以在不更改任何现有源代码的情况下使用它,只需将MyObj实例放在单独的编译单元中即可.
  • 虽然它将在main()之前和之后运行,但是在main之外构造的任何其他对象也将在此时运行.并且你几乎无法控制对象的构造/破坏的顺序.


Ste*_*ano 5

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);
}
Run Code Online (Sandbox Code Playgroud)

http://linux.die.net/man/3/atexit

但是,这仍然意味着您可以访问 main 并且可以添加 atexit 调用。如果您无法访问 main 并且无法添加此函数调用,我认为没有任何选择。

编辑:

C++ 中的解决方案:

正如估计的那样,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;
}
Run Code Online (Sandbox Code Playgroud)

http://en.cppreference.com/w/cpp/utility/program/atexit