C++ 是否有一种从函数内部关闭程序的正确方法?

C++ 是否有一种从函数内部关闭程序的正确方法?,c++,cmd,C++,Cmd,我目前正在制作一个包含菜单和子菜单的程序,我希望有机会从任何子菜单(功能内部)关闭整个程序。我知道我可以用不同的方法来做(我现在用的方法和我知道可以做的方法如下),但是为了将来的使用(我可以证明是有用的),我想知道: 有没有办法从函数中正确地关闭程序 我读了一些答案,从中我得到的是: 我不应该简单地终止代码 我不应该使用任何特定于系统的代码来避免兼容性问题 一点澄清-这是我个人教育目的的计划,所以不必担心,但我宁愿在一开始就学习正确的方法来处理这些情况,也不愿意在以后发现如何处理这些情况并不得不

我目前正在制作一个包含菜单和子菜单的程序,我希望有机会从任何子菜单(功能内部)关闭整个程序。我知道我可以用不同的方法来做(我现在用的方法和我知道可以做的方法如下),但是为了将来的使用(我可以证明是有用的),我想知道:

有没有办法从函数中正确地关闭程序

我读了一些答案,从中我得到的是:

  • 我不应该简单地终止代码
  • 我不应该使用任何特定于系统的代码来避免兼容性问题
  • 一点澄清-这是我个人教育目的的计划,所以不必担心,但我宁愿在一开始就学习正确的方法来处理这些情况,也不愿意在以后发现如何处理这些情况并不得不回去修复后重新学习

    对于代码示例(使用visual studio 2017):

    //跳过与问题无关的代码位
    无效子菜单()
    {
    字符a=0;
    系统(“cls”);//当我找到其他清除屏幕的方法时,还没有改变
    
    std::cout此代码将如您所述工作。

    int main()
    {
        int a;
        while (true)
        {
            system("cls"); //yet to get changed when i'll find other way of clearing screen
            cout << "Pick what you want to do:\n"
                 << "---------------------------------------------------------\n"
                 << "1.Sub_menu\n"
                 << "2.foo\n"
                 << "3.bar\n"
                 << "---------------------------------------------------------\n"
                 << "0. to close\n";
            cin >> a ;
            if (a == 0)
            {
                return 0 ;
            }
            else if (a == 1)
            {
                char b;
                while (true)
                {
                    system("cls");
                    cout << "Pick function:\n"
                         << "---------------------------------------------------------\n"
                         << "1.Foobar_1\n"
                         << "---------------------------------------------------------\n"
                         << "b to go back to menu menu\n"
                         << "x to close\n";
                    cin >> b;
                    if (b == '1')
                    {
                        foobar_1();
                    }
                    else if (b == 'B' || b == 'b')
                    {
                        break;
                    }
                    else if (b == 'x' || b == 'X')
                    {
                        return 0;
                    }
                    else
                    {
                        cout << "invalid input";
                    }
                }
            }
            else if (a == 2)
            {
                foo();
            }
            else if (a == 3)
            {
                bar();
            }
            else
            {
                cout << "invalid input";
            }
        }
        return 0;
    }
    
    intmain()
    {
    INTA;
    while(true)
    {
    系统(“cls”);//当我找到其他清除屏幕的方法时,还没有改变
    
    cout exit()应该始终干净地终止您的程序,并且与系统不同(“exit”)是标准和平台独立的一部分。@Zinki“应该”和“将”之间有区别。此外,您也没有提到对此假设负责的人:程序员应该以一种在大多数情况下都可以终止的方式编写代码,而无需调用析构函数来释放资源。@Zinki,
    exit()不在C++代码中调用大多数析构函数。它不会解除堆栈。我希望防御编程尽量减少由“代码< >”()/代码>引起的损坏,但命令<代码>退出()似乎不现实。
    应该总是干净地终止这个过程。@zinki-我不想使用它,因为@grek40和@eryksun写了些什么。根据我链接的第一个主题,使用
    exit()
    会让程序表现得像海滩上的游客一样,在离开时留下所有的垃圾(请原谅我奇怪的比较).但另一方面,如果它能恰当地完成它的工作,那么拥有这样的便利将是一件好事(就像它从主管道内部关闭一样).好吧,那么,我想有必要从main关闭程序。也许我会尝试一点额外的全局变量,如果从函数返回,那么将关闭循环,main将像平常一样关闭。虽然这看起来有点老套,但可能这种方法唯一的缺点是我对它的看法。谢谢供参考。当您调用函数时,main处于暂停状态,当您从函数返回时,main的状态变为未暂停。希望此答案对您有所帮助
        //skipping unrelevant to question bits of code
           void main()
                    {
                        char a=0;
                        system("cls"); //yet to get changed when i'll find other way of clearing screen
                        std::cout << "Pick what you want to do:\n"
                            << "---------------------------------------------------------\n"
                            << "1.Sub_menu\n"
                            << "2.foo\n"
                            << "3.bar\n"
                            <<"---------------------------------------------------------\n"
                            << "ESC to close\n"
                        while (a != 27)
                        {
                            a = _getch();
                            switch (a)
                            {
                            case 49:
    {
    {
                        char b=0;
                        system("cls");
                        std::cout << "Pick function:\n"
                            << "---------------------------------------------------------\n"
                            << "1.Foobar_1\n"
                            <<"---------------------------------------------------------\n"
                            << "ESC to go back to menu menu\n"
                            << "x to close";
                        while (b != 27)
                        {
                            b = _getch();
                            switch (b)
                            {
                            case 49:foobar_1(); break;
                            case 120:
                            case  88: a=27; break;
                            default: break;
                            };
                        };
                        return;
                    }
    }
    ; break;
                            case 50:foo(); break;
                            case 51:bar(); break;
                            case 120:
                            case  88: system("exit"); break; //i'd like to replace that part
                            default: break;
                            };
                        };
                        return;
                    }
    
    int main()
    {
        int a;
        while (true)
        {
            system("cls"); //yet to get changed when i'll find other way of clearing screen
            cout << "Pick what you want to do:\n"
                 << "---------------------------------------------------------\n"
                 << "1.Sub_menu\n"
                 << "2.foo\n"
                 << "3.bar\n"
                 << "---------------------------------------------------------\n"
                 << "0. to close\n";
            cin >> a ;
            if (a == 0)
            {
                return 0 ;
            }
            else if (a == 1)
            {
                char b;
                while (true)
                {
                    system("cls");
                    cout << "Pick function:\n"
                         << "---------------------------------------------------------\n"
                         << "1.Foobar_1\n"
                         << "---------------------------------------------------------\n"
                         << "b to go back to menu menu\n"
                         << "x to close\n";
                    cin >> b;
                    if (b == '1')
                    {
                        foobar_1();
                    }
                    else if (b == 'B' || b == 'b')
                    {
                        break;
                    }
                    else if (b == 'x' || b == 'X')
                    {
                        return 0;
                    }
                    else
                    {
                        cout << "invalid input";
                    }
                }
            }
            else if (a == 2)
            {
                foo();
            }
            else if (a == 3)
            {
                bar();
            }
            else
            {
                cout << "invalid input";
            }
        }
        return 0;
    }