
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.200.101.84] |
![]() |
|
Страницы: (32) 1 [2] 3 4 ... 31 32 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#16
,
|
|
![]() Сообщения были разделены в тему "goto vs break & continue" Это сообщение было перенесено сюда или объединено из темы "Новый стандарт C++: C++1x" |
Сообщ.
#17
,
|
|
|
Иногда goto вполне себе хорош. Была ситуация, когда в относительно длинной функции в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции. Наиболее простым и понятным вариантом оказался вариант с goto:
![]() ![]() int foo() { ... goto end; ... goto end; ... goto end; ... end: ... return; } Так что goto иногда можно и должно применять. Религиозные фанатики идут лесом. |
![]() |
Сообщ.
#18
,
|
|
Не в c++ то же самое можно сделать через try/finally.
|
Сообщ.
#19
,
|
|
|
Цитата OpenGL @ Не в c++ то же самое можно сделать через try/finally. В С++ нет finally(и правильно). Так что RAII - наше все ![]() |
![]() |
Сообщ.
#20
,
|
|
Ну да, я читал в D&E о причинах его отсутствия. Но у меня не всегда получается сделать подобную вещь без goto/finally
![]() |
Сообщ.
#21
,
|
|
|
Цитата applegame @ int foo() { ... goto end; ... goto end; ... goto end; ... end: ... return; } В нормальном коде для таких целей используются деструкторы классов. Или у тебя хендлы и указатели все в сыром виде? Добавлено Цитата applegame @ в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции. Или, как вариант конкретно в этом случае, оформить эти несколько операций отдельной функцией. |
Сообщ.
#22
,
|
|
|
Цитата OpenGL @ Ну да, я читал в D&E о причинах его отсутствия. Но у меня не всегда получается сделать подобную вещь без goto/finally ![]() А примерчик можешь привести? Добавлено Цитата Pacific @ В нормальном коде для таких целей используются деструкторы классов. Или у тебя хендлы и указатели все в сыром виде? А если pure C? Различные компиляторы предлагают свои средства(вроде cleanup-атрибута в gcc), но переносимого средства нет. Хотя есть разные либы для С, реализующие в том числе и С++-style SEH. |
![]() |
Сообщ.
#23
,
|
|
Цитата OpenGL @ Не в c++ то же самое можно сделать через try/finally. AFAIK, это заметно дороже, чем Go to |
![]() |
Сообщ.
#24
,
|
|
Цитата D_KEY @ Сейчас сходу нет. Давно это было, а в текущем проекте все нормально в этом плане. Вспомню/найду - выложу. А примерчик можешь привести? Добавлено Цитата korvin @ AFAIK, это заметно дороже, чем Go to Ну да. Просто меня в свое время удивило, что при выпрыгивании return-ом в этом случае finally тоже выполнится. |
Сообщ.
#25
,
|
|
|
Цитата applegame @ Иногда goto вполне себе хорош. Была ситуация, когда в относительно длинной функции в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции. Наиболее простым и понятным вариантом оказался вариант с goto: ![]() ![]() int foo() { ... goto end; ... goto end; ... goto end; ... end: ... return; } Так что goto иногда можно и должно применять. Религиозные фанатики идут лесом. ![]() ![]() int foo() { ... //goto end; return end(); ... //goto end; return end(); ... //goto end; return end(); ... //end: return end(); } int end() { ... return ...; } |
![]() |
Сообщ.
#26
,
|
|
Отдельной функции могут требоваться локальные переменные foo, и их придется передавать в параметрах. По-моему, это неудобно
![]() |
Сообщ.
#27
,
|
|
|
Цитата Код нечитабельным делают не сами операторы, а контекст их использования. Любой оператор есть goto. Следовательно, заменив все конструкции структурного программирования на лежащий в их основе goto мы должны снова получить читабельный код. Но пожалуй увы ![]() Вот к примеру код в стиле передачи продолжений, даже очень аккуратно написанный, так ли уж понятен? Хотя там и операторов как таковых особо и нет. Наверно, код делает сложным в первую очередь его логика управления, запутанный поток выполнения, не очевидные побочные эффекты и т.п. |
Сообщ.
#28
,
|
|
|
Цитата OpenGL @ Это следует понимать: "функции с аргументами принципиально не использую - неудобно"? Отдельной функции могут требоваться локальные переменные foo, и их придется передавать в параметрах. По-моему, это неудобно |
Сообщ.
#29
,
|
|
|
Цитата OpenGL @ Отдельной функции могут требоваться локальные переменные foo, и их придется передавать в параметрах. По-моему, это неудобно ![]() Можно захватить. |
![]() |
Сообщ.
#30
,
|
|
Цитата Adil @ Нет, это следует понимать как то, что если потребуется изменить end и при этом ей станет необходимо больше/меньше параметров, то придется изменять ее объявление и вызов. Понятно, что средства рефакторинга это сделают одновременно, но зачем, если проще и наглядней через goto/деструкторы? Кроме того, если функция не возвращает значение, то этот способ не прокатит. Это следует понимать: "функции с аргументами принципиально не использую - неудобно"? |