Я прочитал статью о "Идиоме с именованным контуром" в С++: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop
Эта идиома позволяет нам писать такие вещи:
named(outer)
for(int i = 0 ; i < rows ; ++i) {
named(inner)
for(int j = 0 ; j < cols ; ++j) {
if(some_condition)
break(outer); // exit the 'outer' loop
}
}
Такие конструкции уже существуют как основная функция на многих языках, например Java.
Согласно статье, он может быть реализован на С++, определяя два злых макроса:
#define named(blockname) goto blockname; \
blockname##_skip: if (0) \
blockname:
#define break(blockname) goto blockname##_skip;
Я знаю, что многие люди хотели бы изгнать использование goto
. Я лично нашел его полезным в очень редких случаях, особенно когда я хотел break
собрать вложенные петли. Эта идиома кажется мне чистым решением для этого, но нормально ли использовать ее в реальном коде?
На странице обсуждения статьи можно прочитать:
"Не делай этого. Ты попадешь в ад"
Итак, мои вопросы: Каковы недостатки использования идиомы именованного цикла? Это опасно? Если да, то почему?
Бонусный вопрос: возможно ли реализовать именованный continue
аналогично? (Я думаю, что это невозможно, используя синтаксис named(...) for(...;...;...) {}
, но кто знает?)
РЕДАКТИРОВАТЬ: Я согласен с вами, переопределение ключевого слова противно. Как насчет использования #define breakLoop()
вместо?