2010-06-03 4 views
1

Можно создать дубликат:
Examples of good gotos in C or C++Каковы приемлемые виды использования goto?

Что использует заявления Гото вы считаете приемлемым? Я обсуждаю некоторые рекомендации по кодированию для встроенной работы C и задаюсь вопросом, есть ли случаи, когда goto - самый чистый способ сделать что-то.

+0

интересным читаемым по этому вопросу является [Структурированное программирование с переходом к утверждениям] (http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf), Д. Кнутом. Это было написано в 1974 году, но все еще содержит интересные примеры и мысли. – tonio

ответ

1

Для C я считаю полезным использовать goto для общей точки выхода в некоторых функциях. Если вам нужно освободить ресурсы перед возвратом, приятно сделать retval = -ERROR; goto fn_exit; вместо того, чтобы пытаться вырваться из нескольких слоев для циклов/while.

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

Вот недавний вопрос SO на using goto for error management. Я уверен, что просмотр goto tag даст вам еще больше ответов.

0

Я обнаружил, что существует довольно много мест, где goto может упростить логику. Мое правило состоит в том, что никакие 2 goto не перекрывают друг друга и что goto и его ярлык «закрыты»; обычно не более 30 строк.

Обычно, когда у меня есть сложное условие, что я должен проверить много вещей, Гото может помочь:

if (condition1 && cond2) 
    if (checkFile(file)) 
    goto DONE; 
else 
    if (condition3) 
    goto DONE; 

handleError(); 
return 0; 

DONE: 
...do something... 
return 1; 
+0

Я могу придумать более элегантные решения * без * goto, так что это не сильный аргумент. Например, создав функцию 'int done()' и заменив 'goto DONE' на' return done() '. Существует почти всегда лучший способ, чем прибегать к goto. – Clifford

+0

@ Клиффорд, вы правы, мой пример выше очень упрощен; но в этом и заключается суть: использование goto, которое я предлагаю, это сложная логика, что непросто продемонстрировать на простом примере. Теперь, в некоторых сложных проблемах, я обнаружил, что простой goto более прямой и понятный относительно того, что намерение лучше, чем другие решения. – Gianni

+0

@Clifford вы предлагаете несколько операторов возврата в заданной функции? – simon

0

Мое личное мнение заключается в том, что не существует никакого приемлемого использования заявления Гото в современном программировании язык.

«Заявление GOTO считается вредным», покойный Эдсгер У. Дейкстра, неплохо справляется с проблемой. Эта статья должна быть обязательно прочитана для каждого разработчика программного обеспечения на планете.

Стоит отметить, что цыганский язык из группы Дон Гуда в UT Austin в конце 1970-х годов не имел goto.

Следует отметить, что Ichbiah et al только включил goto в Ada, потому что DoD требовал его, явно, во многих словах в спецификации требований. Я помню, как читал, что Ичбия и его команда сознательно сделали синтаксис ярлыка целевой цели настолько уродливым, насколько это было возможно, чтобы сделать ярлыки торчащими, как больные пальцы, и препятствовать использованию goto.

Смежные вопросы