可能的重复:
程序执行总是从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
之前运行。此代码负责程序的"设置环境"(例如设置stdin
或cin
)。通过将代码放入静态初始化块中,您可以有效地说,"嘿,您也需要这样做,以获得正确的环境"。一般来说,这应该是一些小的东西,可以独立地排列在其他项目的执行顺序中。
如果您需要在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。谢谢