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

时间:2012-11-14 14:40:39

标签: c++ c function main

  

可能重复:
  Does the program execution always start from main in C?

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

void check(void)
void execute(void)

我想从check()开始执行,是否可以在c / c ++中使用?

9 个答案:

答案 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之前运行。此代码负责程序的“设置环境”(例如设置stdincin)。通过将代码置于静态初始化块中,您可以有效地说,“嘿,您还需要这样做才能拥有合适的环境”。通常,这应该是小的,可以独立于其他项目的执行顺序。

如果你需要在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。  谢谢!