Выход из функции C чисто - PullRequest
       17

Выход из функции C чисто

0 голосов
/ 05 апреля 2011

У меня есть пара функций.В основном это меню, в котором пользователь может выбрать 1-n различных параметров, и каждый из этих параметров имеет функцию, связанную с ними.В этом примере это просто тупик.

То, что я пытаюсь определить, - это лучший способ преждевременного выхода из функции.Например, когда пользователь нажимает клавишу ввода, находясь в функции пункта меню, я хочу, чтобы программа отправила их обратно в меню, не запуская ничего в этой функции.

В приведенном ниже случае я просто вызываюshowMenu() и поместите оператор return после него.Единственное, что если пользователь выходит из нескольких функций, то в конце будет цепочка операторов return, которую нужно распутать.

Может кто-нибудь показать мне, если есть более эффективный способ добиться этого илинахожусь ли я на деньгах.

void showMenu()
{
   //Display menu

   //Prompt user for menu option

   //Run function of appropriate menu option
   runSelectedFunction();
} 

void runSelectedFunction()
{
   //Get user input for the function and validate

   //Check if the user input was only a '\n' if so show the menu and exit
   showMenu();
   return;

   //Do the stuff that this function is meant to do.
}

Ответы [ 3 ]

4 голосов
/ 05 апреля 2011

выглядит хорошо для меня.Или - поскольку многие вокруг против того, чтобы несколько точек выхода составляли одну функцию - вы можете сделать:

void func()
{
   //get input

   if ( checkMenu() )
   {
      //do the stuff I am meant to do
   }
   else
   { 
      showMenu();
   }
}

, чтобы избежать добавления второго возврата в вашу функцию.Также вы можете иметь вызов showMenu() всегда в конце функции, в зависимости от ваших потребностей

hth

Mario

0 голосов
/ 05 апреля 2011

Альтернативой является использование следующего шаблона, чтобы гарантировать, что ваша функция всегда возвращается из одного места, давая вам возможность всегда освобождать ресурсы (или сообщать об ошибках и т. Д.):

int func(void)
{
    int ret = 0;

    do
    {
        if (!allocate_resource())
        {
            ret = -1;
            break;
        }

        if (!allocate_more_resources())
        {
            ret = -2;
            break;
        }

        do_stuff();
    }
    while (0);

    free_allocated_resources();

    return (ret);
}
0 голосов
/ 05 апреля 2011

Лучший способ? Короче, не надо.

Почему?

Хотя технически в этом нет ничего плохого, и вы найдете его все повсеместно, иногда это может привести к головным болям при попытке отследить ошибки или утечки памяти в сложном коде.

Используйте досрочный возврат только тогда, когда это абсолютно необходимо, и даже тогда попытайтесь сначала найти альтернативу:)

...