// Adds name to a scope/loop and allows to break from it by name
// Example:
// LABELED(outerLoop) for (auto it = container.begin(); it != container.end(); it++)
// {
// switch (*it)
// {
// case 1:
// BREAK_FROM(outerLoop);
// }
// }
#define LABELED(scopeName) if (false) scopeName:; else
#define BREAK_FROM(scopeName) goto scopeName
C>// Adds name to a scope/loop and allows to break from it by name
C>// Example:
C>// LABELED(outerLoop) for (auto it = container.begin(); it != container.end(); it++)
C>// {
C>// switch (*it)
C>// {
C>// case 1:
C>// BREAK_FROM(outerLoop);
C>// }
C>// }
C>#define LABELED(scopeName) if (false) scopeName:; else
C>#define BREAK_FROM(scopeName) goto scopeName
C>
А разве допустимо переходить внутрь блоков и if'ов?
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, alexqc, Вы писали:
A>>А разве допустимо переходить внутрь блоков и if'ов?
AG>Да хоть внутрь do...while — классика же.
Вообще-то показанное "устройство" — несколько про другое, и там нет передачи внутрь do...while.
Но да, проверил: http://cpp.sh/6oafq — не ругнулось, выполнилось как предполагается.
Хотя для меня это странно — возможность захода в произвольную точку блока "извне" — коверкает логику работы и затрудняет чтение; а уж как можно разрешить заходить внутрь цикла, допуская пропуск его инициализации — .
A>Хотя для меня это странно — возможность захода в произвольную точку блока "извне" — коверкает логику работы и затрудняет чтение; а уж как можно разрешить заходить внутрь цикла, допуская пропуск его инициализации — .
Здравствуйте, alexqc, Вы писали:
A>Вообще-то показанное "устройство" — несколько про другое, и там нет передачи внутрь do...while.
Есть. При входе там переход на case метку с пропуском do.
Единственное отличие — case метки вместо goto меток.
A>Хотя для меня это странно — возможность захода в произвольную точку блока "извне" — коверкает логику работы и затрудняет чтение;
Поэтому goto не любят.
Хотя, очевидный контраргумент — "а ты не используй произвольно, используй только очевидно".
A>а уж как можно разрешить заходить внутрь цикла, допуская пропуск его инициализации — .
Прыгнуть через объявление переменной нельзя.
Вот поэтому, например, в case метках без дополнительных блоков переменные объявлять нельзя, но в последней метке — можно.
Ну а если при объявлении переменная не инициализирована, значит, "мусорная" инициализация устраивает
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, alexqc, Вы писали:
A>>Вообще-то показанное "устройство" — несколько про другое, и там нет передачи внутрь do...while.
AG>Есть. При входе там переход на case метку с пропуском do.
Действительно, case внутри do получается.
A>>а уж как можно разрешить заходить внутрь цикла, допуская пропуск его инициализации — .
AG>Прыгнуть через объявление переменной нельзя. AG>Вот поэтому, например, в case метках без дополнительных блоков переменные объявлять нельзя, но в последней метке — можно.
AG>Ну а если при объявлении переменная не инициализирована, значит, "мусорная" инициализация устраивает
Да, проверил — goto внутрь for(int i=0...) — дает ошибку, goto внутрь for(i=0...) — предупреждение о неинициализированной переменной. Ну и разумеется, если переменная инитится где-то ранее — то не получим даже предупреждения.