可能重复:
Does the program execution always start from main in C?
我想开始执行包含2个函数(不包括main)的程序
void check(void)
void execute(void)
我想从check()开始执行,是否可以在c / c ++中使用?
答案 0 :(得分:9)
您可以使用简单的包装器执行此操作:
int main()
{
check();
}
由于标准明确指定main
作为程序入口点,因此无法以任何其他方式进行移植。
编辑评论:不要这样做。在C ++中,您可以滥用静态初始化,以便在静态初始化期间check
之前调用main
,但您仍然无法从main
合法地调用check
。您可以先check
运行。如评论中所述,这在C中不起作用,因为它需要不断的初始化器。
// At file scope.
bool abuse_the_language = (check(), true);
int main()
{
// No op if desired.
}
答案 1 :(得分:7)
各种链接器有各种选项来指定入口点。例如。 Microsoft链接器使用/ENTRY:function:
/ ENTRY选项指定入口点函数作为起始点 .exe文件或DLL的地址。
GNU的ld uses the -e or ENTRY() in the command file。
有人说,修改入口点是一个非常先进的功能,你必须完全理解它是如何工作的。首先,它可能会导致跳过标准库初始化的加载。
答案 2 :(得分:5)
int main()
{
check();
return 0;
}
答案 3 :(得分:1)
从check
调用main
似乎是最合乎逻辑的解决方案,但您仍然可以探索使用/ENTRY
为您的应用定义另一个入口点。有关详细信息,请参阅here。
答案 4 :(得分:1)
你不能以main之外的其他东西开始,尽管有很多方法可以在main之前执行某些代码。
将代码置于静态初始化块中将使代码在main之前运行;但是,它不是100%可控的。虽然你可以放心它在main之前运行,你不能指定两个静态初始化块在它们都在main之前执行之前运行的顺序。
链接器和加载器都将main的概念作为C / C ++程序的共享“理解”开始;但是,有一些代码在main
之前运行。此代码负责程序的“设置环境”(例如设置stdin
或cin
)。通过将代码置于静态初始化块中,您可以有效地说,“嘿,您还需要这样做才能拥有合适的环境”。通常,这应该是小的,可以独立于其他项目的执行顺序。
如果你需要在main之前按顺序执行两到三件事,那么就把它们变成正确的函数并在main的开头调用它们。
答案 5 :(得分:1)
有一种人为的方法可以实现这一点,但它只不过是一种黑客攻击。
这个想法是创建一个包含main函数的静态库,并使其调用“check”函数。 链接器将在链接到您的“程序”时解析符号,并且您的“程序”代码本身确实没有主体。
除非你有非常特殊的需求,否则不建议这样做(一个例子是Windows Screensavers,因为Windows SDK附带的帮助库有一个执行特定初始化的主函数,比如解析命令行)。
答案 6 :(得分:1)
它可能得到编译器的支持。例如,gcc,您可以使用-nostartfiles和--entry = xxx来设置程序的入口点。默认入口点是_start,它将调用函数main。
答案 7 :(得分:0)
您可以通过在主要开始之前创建对象来“拦截”对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;
}
答案 8 :(得分:0)
我找到了解决自己问题的方法。 我们可以简单地使用
#pragma startup function-name <priority>
#pragma exit function-name <priority>
这两个pragma允许程序指定应该在程序启动时(在调用main函数之前)或程序退出(在程序通过_exit终止之前)调用的函数。
指定的函数名必须是先前声明的函数,不带参数并返回void;换句话说,它应该声明为:
void func(void);
可选优先级参数应为64到255之间的整数。最高优先级为0.优先级较高的函数在启动时首先调用,最后在退出时调用。如果未指定优先级,则默认为100。 谢谢!