C++没有main()函数?

15

我是一名应届程序员,对于C++,我希望每个程序都会有一个main()函数。

然而,我收到了一个使用Visual Studio 6.0编写的C++项目,它没有main()函数。我真的无法想象这个程序是如何执行的或从哪里开始的。

我已经看过使用宏来更改main()函数名称的示例,但这段代码没有展示这种做法的任何迹象。

有人能够建议我该找什么吗?


1
你需要提供更多的上下文。Windows程序有一个“WinMain”函数,因此没有主函数(main)。 - Diego Sevilla
感谢您的快速回复。我相信这是一个Windows应用程序,使用Microsoft基础类库。如果一个类从CWinApp继承,那么编译器会将其视为入口点吗? - user840474
你确定这不是一个lib或dll项目吗? - rossble
额,说实话我不太确定。它确实输出了一个可执行文件,所以我认为它是一个程序。但是没有winmain函数。 - user840474
很抱歉,它不包含WinMain()函数。有一个与项目同名的类,并且它扩展了CWinApp,所以我想知道程序是否初始化了该类。但是像我说的那样,我从未见过这样的东西。在MainFrm.cpp中还有一个MainFrame类,我相信这是一个生成的表单? - user840474
如果你正在使用Visual Studio,你可以在你认为程序可能开始的地方(例如从继承自CWinApp的类的构造函数)设置一个断点,并通过堆栈跟踪逐步调试。这并不总是有帮助,但对于你的情况可能会起作用。 - Tim Meyer
5个回答

14

首先,它可以是一个库、动态链接库或静态库,并且没有main()函数。其次,它也可以是一个Windows应用程序,有另外一个入口点,例如WinMain()函数。在Visual Studio中还有一个_tmain()函数,或者其他的函数,它是对main()函数的一种包装。


14

也许主函数在一个库中,程序从静态对象的虚拟函数调用开始。这就是 MFC 应用程序中发生的情况。

该程序从 CWinApp 派生一个类,并将其实例化为静态变量。然后 MFC 知道了一个指针(由 CWinApp 的构造函数设置),并在该指针上调用虚拟函数 InitInstance()。

可以看到,在此处,程序的软件接管了控制权......


这似乎是程序的运行方式。我有一个与项目同名的类,它继承自CWinApp。同时,在CPP文件中,它创建了一个指向自身的变量。可以安全地假设这个类的构造函数是入口点吗?(替换main()函数?) - user840474
这是一个依赖于实现的解决方案,因为我知道有些链接器拒绝在库中查找入口点。不具备可移植性! - bert-jan
不可以将成员函数作为入口点,因为没有对象可以开始执行。 - bert-jan
1
CWinApp::CWinApp() 被调用并存储了一个指向自身的指针,以便 MFC 主函数知道用户在哪里创建了派生类对象。 - bert-jan
没错,这非常有道理。感谢您的时间,接下来我会多了解一些关于WinMFC方面的内容。谢谢。 - user840474

3
尽管标准规定程序必须有一个main函数,但如果链接的库中已经定义了main函数,应用程序开发人员不需要编写它。此外,一些链接器允许您将入口点重新定义为除main之外的其他内容。
是否存在WinMain函数?

2

如果你正在编写 Windows 控制台应用程序,你需要一个 main() 函数;但是如果你正在处理 DLL,则需要一个 DllMain() 函数。对于 Windows 应用程序,你应该期望一个 WinMain() 函数。


1

仅供参考,由于这不是一般情况,在C语言(我想在C++中也是如此)中可能存在没有主函数的程序。(我几年前就用过这样的程序)。虽然它是在嵌入式编程环境下而非Windows上运行的。

诀窍在于汇编语言中的启动代码在执行完后调用了一个完全不同的函数。

所以即使我们的老师教我们C/C++中总有main函数,这也不是绝对的真理。


标准使用的术语是,在独立实现中,入口点可以是任何东西;在托管实现中,入口点必须是main。尽管Windows编译器在除了具有不同入口点之外的所有方面都像托管实现一样运行! - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接