如何在c/c++中从不同的函数而不是main()开始执行程序

how to start the execution of a program in c/c++ from a different function,but not main()

本文关键字:main 函数 执行程序 开始 c++      更新时间:2023-10-16

可能的重复:
程序执行总是从C中的main开始吗?

我想开始执行我的程序,该程序包含2个函数(不包括主函数)

void check(void)
void execute(void)

我想从check()开始执行,在c/c++中可能吗?

您可以使用一个简单的包装器:

int main()
{
check();
}

由于标准明确指定main作为程序入口点,因此不能以任何其他方式进行移植。

编辑以征求意见:永远不要这样做。在C++中,您可以滥用静态初始化,在静态初始化期间在main之前调用check,但仍然不能从check合法调用main。您可以先运行check。正如注释中所指出的,这在C中不起作用,因为它需要常量初始化器。

// At file scope.
bool abuse_the_language = (check(), true);
int main()
{
// No op if desired.
}

各种链接器都有各种选项来指定入口点。例如,Microsoft链接器使用/ENTRY:函数:

/ENTRY选项指定一个入口点函数作为起点.exe文件或DLL的地址。

GNU的ld在命令文件中使用-e或ENTRY()。

需要说明的是,修改入口点是一项非常高级的功能,您必须完全了解它的工作原理。首先,它可能会导致跳过加载标准库的初始化。

int main()
{
check();
return 0;
}

main调用check似乎是最合乎逻辑的解决方案,但您仍然可以探索使用/ENTRY为应用程序定义另一个入口点。请参阅此处了解更多信息。

您不能从main以外的地方开始,尽管有一些方法可以让某些代码在main之前执行。

将代码放入静态初始化块将使代码在main之前运行;然而,它不会100%可控。虽然可以保证它在main之前运行,但不能指定两个静态初始化块在它们都在main之前执行之前运行的顺序。

链接器和加载程序都有主保持的概念,作为C/C++程序的共享"已理解"的开始;然而,有一些代码在main之前运行。此代码负责程序的"设置环境"(例如设置stdincin)。通过将代码放入静态初始化块中,您可以有效地说,"嘿,您也需要这样做,以获得正确的环境"。一般来说,这应该是一些小的东西,可以独立地排列在其他项目的执行顺序中。

如果您需要在main之前按顺序执行两到三件事,那么将它们转换为适当的函数,并在main的开头调用它们。

有一种人为的方法可以实现这一点,但它只不过是一种破解。

其想法是创建一个包含主函数的静态库,并使其调用您的"check"函数。链接器将在链接到您的"程序"时解析符号,并且您的"程式"代码本身确实没有main。

除非您有非常特殊的需求,否则不建议这样做(脑海中浮现的一个例子是Windows屏幕保护程序,因为Windows SDK附带的帮助程序库有一个主要功能,可以执行特定的初始化,如解析命令行)。

编译器可能支持它。例如,gcc,您可以使用-nostartfiles和--entry=xxx来设置程序的入口点。默认的入口点是_start,它将调用函数main。

您可以通过在main启动之前创建一个对象来"拦截"对main的调用。构造函数需要执行您的函数。

#include <iostream>
void foo()
{
// do stuff
std::cout<<"exiting from foo" <<std::endl;
}
struct A
{
A(){ foo(); };
};
static A a;
int main()
{
// something
std::cout<<"starting main()" <<std::endl;
}

我已经找到了自己问题的解决方案。我们可以简单地使用

#pragma startup function-name <priority>
#pragma exit function-name <priority>

这两个杂注允许程序指定应该在程序启动时(在调用主函数之前)或程序退出时(就在程序通过_exit终止之前)调用的函数。

指定的函数名必须是以前声明的函数,该函数不接受任何参数并返回void;换句话说,它应该声明为:

void func(void);

可选优先级参数应为64到255之间的整数。最高优先级为0。优先级较高的函数在启动时首先被调用,在退出时最后被调用。如果没有指定优先级,则默认为100。谢谢