15

这可能是一个简短而简单的问题,但我从未找到令人满意的答案:

main() 函数在大型 C++ 项目中通常包含哪些代码?认为它通常只是初始化(包装)类对象并调用其中的一个函数来启动它是一个错误的假设吗?

为什么 main() 首先不是方法?是为了保持与 C 的向后兼容性吗?

4

9 回答 9

10

在我的代码中,它基本上是一个构造函数调用,可能是一个方法调用,以及一些异常处理。这是我自己的项目的主要内容(省略了标题和注释,并且格式被 SO 弄乱了,像往常一样):

int main( int argc, char * argv[] ) {
    int result = 0;
    try {
        CLIHandler ch( argc, argv );
        result = ch.ExecCommand();
    }
    catch( const Exception & ex ) {
        result = ExceptionHandler::HandleMyError( ex );
    }
    catch( const std::exception & ex ) {
        result = ExceptionHandler::HandleOtherError( ex );
    }
    catch( ... ) {
        result = ExceptionHandler::HandleUnknownError();
    }
    return result;
}
于 2009-08-01T17:34:52.620 回答
2

我的通常是这样

  • 命令行解析
  • 顶层对象的初始化
  • 异常处理
  • 进入主'exec'循环

据我了解,int main(int argc, char *argv[])由于传统,本质上是一种约定C。从来没有让我觉得奇怪,而是很有用。毕竟 C++ 扩展了 C ......(是的,它们之间存在细微差别,但这不是这里的问题)。

于 2009-08-01T17:28:55.657 回答
2

是的,原因是向后兼容。main 是生成可执行文件的 C 程序中唯一允许的入口点,因此在 C++ 程序中也是如此。

至于在 C++ main 中做什么,这取决于。一般来说,我曾经:

  • 执行全局初始化(例如日志子系统)
  • 解析命令行参数并定义一个包含它们的适当类
  • 分配一个应用程序对象,设置它等。
  • 运行应用程序对象(在我的例子中,是一个无限循环方法。GUI 编程)
  • 在对象完成其任务后进行最终确定。

哦,我忘记了申请中最重要的部分

  • 显示启动画面
于 2009-08-01T17:29:00.073 回答
1

简短的回答:这取决于。它可能会创建一些在程序运行期间需要的本地对象,配置它们,告诉它们彼此的信息,并在其中一个上调用长时间运行的方法。

程序需要一个入口点。如果main必须是对象上的方法,它应该是什么类类型?

作为main全局入口点,它可以选择要设置的内容。

于 2009-08-01T17:28:19.293 回答
1

我的 main() 函数经常构造各种顶级对象,让它们相互引用。这有助于最小化耦合,将不同顶级对象之间的确切关系限制在主对象中。

通常,这些顶级对象具有不同的生命周期,包括 init()、stop() 和 start() 方法。main() 函数管理使对象进入所需的运行状态,等待任何表明该关闭的时间,然后以受控方式关闭所有内容。同样,这有助于保持事物正确解耦,并将顶级生命周期管理保持在一个易于理解的位置。我在反应式系统中经常看到这种模式,尤其是那些有很多线程的系统。

于 2009-08-01T21:44:01.180 回答
0

通过在高级链接器选项下的项目设置中选择入口点,您可以在 MSVC++ 编译器中使用静态类成员函数代替 main。

这真的取决于你的项目,你想在那里放置什么......如果它很小,你也可以在那里放置消息循环、初始化和关闭代码。在较大的项目中,您将不得不将它们移动到它们自己的类/函数中,或者更少地具有单一的入口点函数。

于 2009-08-01T17:30:29.117 回答
0

并非所有 C++ 应用程序都是 OOP,无论哪种方式,所有代码都需要一些入口点才能开始。

当我编写 OOP 代码时,我main()倾向于包含一个对象实例化,可能由一些用户输入进行。我这样做是因为我觉得“工作”是在一个对象内完成的,否则代码不是以 OOP 的“精神”编写的。

于 2009-08-01T17:30:31.770 回答
0

真正的大型项目往往不仅仅包含一个程序。因此将有几个可执行文件,每个都有自己的主文件。顺便说一句,这些可执行文件通过队列进行异步通信是很常见的。

是的,每个 main 确实往往非常小,初始化一个框架或其他什么。

你的意思是为什么 main() 是一个函数而不是类的方法?那么,它将是什么类的方法?我认为这主要是 C++ 从 C 中继承下来的,但是......一切都必须从某个地方开始 :-)

于 2009-08-01T17:30:36.370 回答
0

我通常使用 main 在命令行中读取,初始化全局变量,然后调用适当的函数/方法。

于 2009-08-01T17:35:50.650 回答