【问题标题】:Rerunning my main method重新运行我的主要方法
【发布时间】:2017-01-31 03:35:44
【问题描述】:

我刚刚完成了一个通过终端控制台命令运行的图像编辑器。编辑图像后,我试图让整个程序(通过 main() 方法)再次运行,但我对如何这样做有点困惑。 这是我尝试重新运行代码的方法。

void rerun()
{
    cout << "Would you like to alter another image? (Y/N) ";
    string answer;
    getline(cin, answer);
    while (answer != "Y" || answer != "N")

        if (answer == "N") {
            return;
        }
    if (answer == "Y") {
        main();
    }
}

这并没有给我任何东西。我需要解决什么问题?

【问题讨论】:

  • 调用main() 是未定义的行为。改用循环或将main() 中的代码移动到函数中。
  • 我刚刚通过在线 c++ 代码格式化程序运行了代码。我已经在 c++ 标签下做了几百次来修复格式错误的代码。
  • @abelenky 不确定。 C++ 标准 3.6.1:The function main shall not be used within a program. 究竟在哪里说调用 main 是未定义的行为?

标签: c++ terminal main


【解决方案1】:

C++ 标准禁止直接调用 main(),就像您尝试做的那样:

3.6 开始和结束

...

3 - main 函数不能在程序中使用。

main() 只能由您的操作系统从您的环境中调用。你不能直接调用它。

因此,您需要重新构建程序的逻辑,以便在需要时具有重新运行整个程序的效果。例如:

int main(int argc, char **argv)
{
    int ret;

    do
    {
        ret = your_real_main(argc, argv);
    } while (ret == -1);

    return ret;
}

无论你当前的main() 中有什么,将其重命名为you_real_main()(并相应地声明它),如果your_real_main() 返回-1,它将被重新执行,就像它被再次调用一样。所有其他返回值都从 main() 本身返回,并带有它们所做的任何含义,用于您的 C++ 实现。

请随意使用来自your_real_main() 的任何特殊返回值,而不是-1,来实现此行为。

当然,您有责任做任何必要的事情以使这项工作正常进行。比如清理你分配的所有资源,所以当your_real_main()返回的时候,所有被分配的东西都被释放了,你的应用程序的状态和它启动时的状态是一样的(所有动态分配的内存都有已发布,所有文件已关闭,等等...)。

通过一些仔细的计划,也可以通过使用小心抛出的异常而不是特殊的返回值来实现相同的结果。然后可能会有特定于操作系统的方法来实现相同的目标,例如 Linux 上的exec(),也...

【讨论】:

  • 正是我正在寻找的答案。谢啦!它运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多