C ++ - 通过调用main()函数重新启动游戏

时间:2016-04-01 18:47:36

标签: c++ main

我正在建造一个小游戏。 其中一个输入选项是重启游戏。我能想到这样做的唯一方法是从主函数

中调用main函数
int main(int argc, char argv[]) {
 ...
 if (input == "restart") {
  main(argc, argv);
 }

这是不好的形式?它会工作吗?

6 个答案:

答案 0 :(得分:12)

不,C ++标准不允许手动调用main

引用标准(C ++ 11:3.6.1主要功能)

  

函数main不得在程序中使用。联系   (3.5)main是实现定义的。       将main定义为已删除或将main声明为内联,静态或constexpr的程序是错误的       形成。名称main不以其他方式保留。

答案 1 :(得分:6)

您无法递归调用main()。这实际上是未定义的行为。

改为使用循环:

int main() {
     bool restart = false;
     do {
         // Do stuff ...

         // Set restart according some condition inside of the loop
         if(condition == true) {
             restart = true;
         } // (or simplyfied restart = condtion;)
     } while(restart);
}

答案 2 :(得分:5)

不要这样做。来自http://en.cppreference.com/w/cpp/language/main_function

  

主要功能有几个特殊属性:

     

1)它不能在程序中的任何地方使用

     

a)特别是,它不能被递归调用

答案 3 :(得分:0)

由于在C ++中递归调用main是不可能的,并且不能真正解决问题,所以我的2美分是如何处理问题的:

基本上,任何大型程序都是一个循环,可能如下所示:

int main()
{
    bool quit = false;

    //Initialise and aquire resources...
    while (!quit)
    {
        //Run game and set quit if user wants to quit...
    }
    //free resources, should be automatic when RAII is adhered.
}

你的游戏应该已经看起来像这样,因为任何不是循环的程序都会不可避免地退出并且不会成为游戏的主角。只需将结构更改为:

int main()
{
    bool quit = false;
    bool restart = false;

    while (!quit)
    {   
        Restart = false;
        //Initialise and aquire resources...
        while (!quit && !restart)
        {
            //Run game and update quit and restart according to user input.            
        }
        //free resources, should be automatic when RAII is adhered.
    }
}

答案 4 :(得分:0)

你可以使用GOTO,但这不是一般编程的好方法。正如那些人提到使用布尔值或循环来检查当前状态或任何其他方式而不是goto,因为它有时会导致编译器出现问题。但它仍然可以在C而不是C ++(AFAIK)

中使用

答案 5 :(得分:0)

如果除了重新加载内部资源之外,还需要重新加载游戏链接到你的库等外部内容,方法是在线程中重新启动游戏,分离线程然后关闭。

我在我自动更新的游戏中使用它,以启动新更新的可执行文件和库。

int main() {

    //initialize the game

    bool restart=false, quit=false;

    while (!quit) {
        //Main loop of the game
    }

    if (restart) {
        #ifdef _WIN32
            std::thread relaunch([](){ system("start SpeedBlocks.exe"); });
        #elif __APPLE__
            std::thread relaunch([](){
                std::string cmd = "open " + resourcePath() + "../../../SpeedBlocks.app";
                system(cmd.c_str());
            });
        #else
            std::thread relaunch([](){ system("./SpeedBlocks"); });
        #endif
        relaunch.detach();
    }

    return 0;
}

有点黑客,但它完成了工作。 #ifdef只是让它使用适用于Windows / Max / Linux的正确启动cmd。