Использование goto

*перенес из ветки обсуждения компании Самсунг*

JBM

Самсунг порадовал. Сползли под столы всем офисом.

Коротенькая вводная:

Наверное ни для уже кого не секрет, что Самсунг наваял свою операционку Bada и собирается выпускать на ней смартфоны. Также, полагаю уже не секрет, что их киевский R& D принимал непосредственное участие в её разработке.

А порадовал Самсунг вот чем: Официальная документация по Баде

нотариально заверенный скриншот № 1: s005.radikal.ru/...​/1007/01/33089f00fcb6.png

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

Обратите внимание на два goto в красных квадратиках. В случае ошибки будет переход на CATCH, однако возвращаемое значение E_SUCCESS. Бага в официальном примере. Блин, ребята, ну это же позорище...

нотариально заверенный скриншот № 2: s45.radikal.ru/...​/1007/2a/e28852e199a5.png

А вот этот goto гораздо зачетнее. В плюсах категорически запрещено с помощью goto выходить из блока. В результате такого выхода будет пропущено удаление объектов созданных (в том числе неявно) при входе в блок. И хотя в данном конкретном примере утечек вроде бы нет, такая практика крайне порочна. Даже если сейчас в блоке нет создания объектов, то по закону Мерфи их кто-нибудь обязательно добавит позже.

В общем, вот линк, там этого фана навалом. dpimg.ospos.net/...​ce.help/FramesetMain.html menu=MC01010200& mtb1=& mtb2=

И это сделано руками тех людей, которые год назад на собеседованиях кидали неистовые понты, чмыря и топча кандидатов за мелчайшие ошибки. А на поверку сами оказались горе-кодерами. Время расставило всё по местам. Так-то!

bill_gates

2JBM:

не стоит выствлять свой опыт и знания на показ.

1. там вполне легальный стиль использования goto, такое по коду связаному с девайсами встречается часто.

2. во всех доках что я встречал в качестве примеров демонтсрируется только то что надо, и забивается болт на обзвязку в виде проверки параметров/обработки ошибок.

А вот этот goto гораздо зачетнее. В плюсах категорически запрещено с помощью goto выходить из блока. В результате такого выхода будет пропущено удаление объектов созданных (в том числе неявно) при входе в блок.

может обьясниш где ты нашел категорисеский запрет на такое? вот маленкий пример:

Examples of good gotos in C or C++

stackoverflow.com/...​s-of-good-gotos-in-c-or-c

realist

2 JBM

Использование goto, как частный случай с переходом на единственную точку выхода это прием известный. Некоторое пояснение:

kerneltrap.org/node/553/2131

www.xml.com/...​ter/book/ch02.html#buierr

Время действительно расставило все по местам — чморили не напрасно.

JBM

2 bill_gates, realist

Как я уже написал, я не страдаю goto-фобией, это ламерское. Я наоборот говорю что грамотное и аккуратное использование goto позволяет избежать проблем. Однако не надо путать чистый С и С++. Примеры, приведенные по ссылкам, относятся к чистым сям и там нет никаких проблем с goto. Однако, в С++ проблемы появляются очень легко. Простейший пример:

Вариант 1:

Container cont;

cont.put (item1);

cont.put (item2);

goto EXIT;
...

EXIT:

return;

Вариант 2:

{

Container cont;

cont.put (item1);

cont.put (item2);

goto EXIT;
}
...

EXIT:

return;

Разницу улавливаете?

JBM

Ну и если уж на то пошло, то даже для чистого С их goto неправильный. Сравните и попытайтесь понять разницу:

Самсунг’s ноу-хау:

RES foo () {

RES result = SUCCESS;
....
....

return result;

CATCH:

/* do cleanup */

return result;
}

Правильно:

RES bar () {

RES result = FAIL;
....
....

return SUCCESS;

CATCH:

/* do cleanup */

return result;
}

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Блин, ребята, «delete 0; » — вполне валидная ничего не делающая операция и без всяких ключей. И никаких ексепшинов она не вызыват. И прога не валится ни разу.

2 ScorpZ

если оператор delete не перегружен

Не обязательно, может их компилятор поддерживает ключ типа -o0 (ничего не делать при удалении нуля), впрочем, это то же самое, что перегрузка delete.

К сказанному eugene_n хотелось бы добавить, что embedded понятие ну очень растяжимое. На одном полюсе контроллеры у которых вообще нет ОЗУ-только регистры и флеш, на другом — девайсы на ARM9/11, MIPS итд с сотнями Мб RAM использующие в качестве OC, например, Linux или WindowsCE. И все это вроде как эмбеддед. Естественно подходы к написанию программ в каждом случае отличаются.

Еще поражает модерация — значит ху*та про трансформаторы и плиты бош в этой теме — это нормально, а мой пост — нет?... Уж воистину у когото ембеддед головного мозга в терминальной стадии.

Я в шоке за что людям бабло платят, не код, а сплошной баг.

Сразу, что бросилось в глаза -

---------------------
ByteBuffer *pBuffer = 0; // проинициализировали
---------------------
if (null == pBitmap) goto CATCH;
---------------------
// initializated pBuffer
---------------------
CATCH:
delete pImage;
delete pBuffer; // в этом месте указатель нулевой !!!


Ну вот и все, если оператор delete не перегружен для ByteBuffer то прога завалится на удалении нулевого указателя.

Например, внутри твоего мега телефона с терабайтами ОЗУ стоит вай-фай или там файмакс чип с каким нибудь нибудь 926 АРМом с 16 мб оперативки и 8 мб флеша? А в этом чудесном АРМе какой нибудь РТОС и прошивочка написанная по всем канонам разработки ембеддед софта...

COM-порт за щитком сзади:)

Жестяк:)

Какой тут эмбеддед?

Пойди в Гугл транслейт и проясни для себя значение слова embedded.
Потом сходи в википедию и проясни что такое embeded software/
И только после этого придешь сюда махать руками.
-

Кстати, как там поживает твой брат по разуму — региональный дирехтор мелкософта?

Майк, а как прошиваются топовые плиты Боша? JTAGом?

COM-порт за щитком сзади:)

Главное в этом знать где Боша адрес и на каком языке писать

Ну могли бы сказать «не делай так больше», и на этом и остановиться.

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

Философия Java/C# программистов — неважно как работает данный код, важно чтобы функционировала система в целом

Уважаемый, поменьше рассуждай о том, в чем ничего не понимаешь.

Чем больше читаю этот форум — тем больше убеждаюсь, что большинство ембеддеров — неадекваты с зашкаливающим ЧСВ и крайне узким кругозором.

2 Mike Gorchak

Главное в этом знать где Боша адрес и на каком языке писать

А пока эта ось стоит только на мобильниках и в данном случае embedded подход для приложений не только не полезен, но наоборот вреден.

Слава Богу, в Самсунге так не считают.

Через 2 недели я имел персональную прошивку с исправленным багом.

Майк, а как прошиваются топовые плиты Боша? JTAGом?

Народ,
Здесь мы говорим про API которое разработчики ОС BADU выкатили для разработчиков приложений под эту ось.
Если Вы покажете девайсы на трансформаторной подстанции или хотя бы роутеры, которые работают под этой осью, то тогда в этом разговоре будет смысл.

А пока эта ось стоит только на мобильниках и в данном случае embedded подход для приложений не только не полезен, но наоборот вреден.

Soft, Вы что, серьезно выкидываете телефон, если на нем повисло какое-то приложение?

Пример. У меня зависла бошевская электроплита (топовая). Чтобы её перезагрузить, вытянув розетку, нужно отодвинуть холодильник, чтобы отодвинуть холодильник нужно перенести стойку с цветами. Процесс нетривиальный. Я это сделал один раз. Потом воспроизвёл баг ещё несколько раз и написал бошу полное описание. Суть бага, если после выключения света я хочу выставить часы, но крутанув ручку установки со скоростью больше какой-то, то плита пишет, что не отвечает датчик 4 (гриль) и виснет. Вся производительность процессора в плите уходила на обработку ручки установки, не успевая обрабатывать данные температурных сенсоров. Через 2 недели я имел персональную прошивку с исправленным багом. С нашим выключением света на пару минут я был бы обречён иметь этот баг через раз, раз в два месяца. Если бы багу не исправили, плиту, конечно, я бы не викинул, но и бош я больше не покупал бы принципиально никогда. Плите уже 5 лет, больше не глючила никогда.

Если рухнуло или повисло устройство это катастрофа которая может окончиться вплоть до людских жертв (есть конечно ватчдог, но это не совсем то).

Да необязательно.
Я просто хотел бы послушать, что запоют любители писать без ограничений, если их DSL-роутер придется ресетить хотя бы раза три на день:)

Кстати в таких устройствах достаточно часто используются дешевенькие процессора без аппаратно защиты памяти...


mob developer 6 мин. назад
Soft, Вы что, серьезно выкидываете телефон, если на нем повисло какое-то приложение?
Круто живете однако...
Телефонные приложения, к сожалению, пишут быдло-джаверы (правильный подход, но в неправильной ситуации). Так что стабильностью они не обладают. И с этим большинство уже смирилось.

А вот глюкнувший ембед-девайс на трансформаторной подстанции может спалить транс на 130000 грн. Про более дорогую и ответственную технику я уже не говорю.

mob developer
мобильные телефоны это не embedded

Вот представьте что у вас раз в месяц зависает железо на электростанции. Что делать будете?


Последние несколько лет занимаюсь разработкой под разнообразные мобильные платформы.
Все эти истории про ограничения эмбеддед-кода устарели лет на 5, а то и на 10.
Можно конечно им следовать, но это увеличит время разработки, усложнит поддержку кода и не принесет АБСОЛЮТНО никакой выгоды.
Ну нельзя же всерьез при разработке мобильного приложения ставить на первое место вопрос «А что будет если мое приложение проработает год подряд? Не упадет ли оно? »

Ого, хардкорный эмбеддер нашелся. Ты хоть никому в реале не говори, а то засмеют.

это было к тому что сегодня память стоит в разы меньше чем еще пару лет назад, и иногда человеко-часы поддержки и разработки стоят дороже чем микросхема... сложно представить что в эмбедет иначе, так как для ПС размер планки памяти не менялся практически, а только технологии, думаю их можно спроэктировать на эмбедет...

Как бы это сказать...Есть несколько моментов...
1. Кристалл DDR стоит 3−5 долларов. Для сервера это нечувствительно, для мобильного телефона, навигатора или точки доступа очень даже. Особенно если умножить эти 10−15 долларов на тиражи подобных устройств.
2. Кристалл DDR занимает на плате 1−2 квадратных сантиметра, что чувствительно для портативного устройства. Кстати многослойная печатная плата тоже стоит денег.

3. Кристалл DDR потребляет приличную мощность, что отражается на работе батарейных устройств, и на охлаждении сетевых — допустим оборудования связи.

Soft, Вы что, серьезно выкидываете телефон, если на нем повисло какое-то приложение?

Круто живете однако...

Господа. У вас конфликт не в самом подходе, а конфликт философии подходов. Это как холивар C++ vs Delphi? Причем довольно легко найти задачу которую легко реализовать на Delphi, а реализация на С++ будет катастрофой, так и обратную задачу.
Философия Java/C# программистов — неважно как работает данный код, важно чтобы функционировала система в целом. Это достигается тем подходом, который описал фон Нейман в своей книге «Вероятностная логика и синтез надежных организмов из ненадежных компонент». Рухнувший сервис в Java программировании это не катастрофа, а нормальная его работа, так как функционал подхватит рядом состоящий в кластере. Неважно сколько элементов или кода не функционально, если функционирует вся система.
Философия эмбедеров — это философия 28 панфиловцев или 300 спартанцев. Если рухнуло или повисло устройство это катастрофа которая может окончиться вплоть до людских жертв (есть конечно ватчдог, но это не совсем то). Поэтому код не обязательно должен быть красив или понятен, но он должен быть надёжен как египетские пирамиды. Почему же самым надёжным устройством до сих пор остаются схемы где их логика работы не запрограммирована, а спаяна. Так что основой философии ембедед-программирования является надёжность даже в ущерб читаемости или сложности поддержки и расширения функционала кода.
Поэтому смысл данного спора в том что то что удобно и просто необходимо в ембед будет катастрофой в Java или наоборот. Это в Java можно перезагрузить сервер с автоматическим перезапуском, а если ембедед повисло чаже пары раз в год, то оно сломано и выкидывается все устройство, а не сам код.
PS

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

У меня на машине 24 гига оперативы, думаю не сильно замечу;)

это было к тому что сегодня память стоит в разы меньше чем еще пару лет назад, и иногда человеко-часы поддержки и разработки стоят дороже чем микросхема... сложно представить что в эмбедет иначе, так как для ПС размер планки памяти не менялся практически, а только технологии, думаю их можно спроэктировать на эмбедет...

Думаю embedded — это не одни мобилки с перезапуском раз в несколько дней.

Последние несколько лет занимаюсь разработкой под разнообразные мобильные платформы.
Все эти истории про ограничения эмбеддед-кода устарели лет на 5, а то и на 10.
Можно конечно им следовать, но это увеличит время разработки, усложнит поддержку кода и не принесет АБСОЛЮТНО никакой выгоды.

Ну нельзя же всерьез при разработке мобильного приложения ставить на первое место вопрос «А что будет если мое приложение проработает год подряд? Не упадет ли оно? »

эмбедет обычно работает с реальными адрессами?

Иногда да, если процессор не имеет аппаратного менеджера памяти, или его не поддерживает операционка.

Сейчас же типичный мобильный телефон имеет больше памяти и мегагерц чем мой первый компьютер.

Да, но он не имеет такого малозаметного юзеру элемента как своп, который ненавязчиво удваивает-утраивает фактичесую память. Поэтому например за рекурсию в эмбеде бьют железной палкой по рукам.
Еще один момент — работа в режиме 24×7, поэтому мемори-лики недопустимы категорически.
Поэтому есть свод правил кодирования для таких систем, которые звучат примерно так:
1. Никаких рекурсий.
2. Никакого динамического выделения памяти, без острой надобности. Желательно все необходимые объекты построить на старт-апе и больше не трогать.
3. Никаких эксепшенов — источников бесконтрольного пожирания стека.
4.Как следствие из предыдущего — никакого STL, если категорически надо — специальные безопасные сборки. По минимуму шаблонов вобще. new в виде new (nothrow) итд, итп.
Эти правила не являются догмой, но игнорирующий их без достаточных оснований рискует никогда не закончить отладку — код будет расползаться под руками.

Приведенные в начале топика примеры как раз и являются образцами добротного эмбеддед-кода.


denis.gz 5 мин. назад

Я обычно do {} while (false) использую вместо goto:

При екзепшене будет утечка. Часто приходится в том же С++ использовать сторонние библиотеки и лень разбираться, генерируют они на данный метод екзепшен или нет.

Народ, тут хотя бы половина понимает, что пишет? Это эмбеддед устройство, с ограниченным количеством памяти, свопа нет, поэтому все это это высокоуровневое барахло, неявно генерирующее неопределенные расходы хипа и стека, здесь недопустимо.

Если бы все так было серьезно как ты рисуешь — то С++ бы там не было, а писалось бы все на чистом С в лучшем случае. Как там Кнут писал? «Преждевременная оптимизация — горе всех бед».

Чтобы по-простому зайдите в свойства винды и отключте файл подкачки — получите отдаленный аналог эмбеддед устройства. Оцените производительность:)

У меня на машине 24 гига оперативы, думаю не сильно замечу;)

кстати, так как файл подкачки влияет на хип и стек?

Чтобы по-простому зайдите в свойства винды и отключте файл подкачки — получите отдаленный аналог эмбеддед устройства. Оцените производительность:)

Это эмбеддед устройство, с ограниченным количеством памяти, свопа нет, поэтому все это это высокоуровневое барахло, неявно генерирующее неопределенные расходы хипа и стека, здесь недопустимо.

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

Мусчина, вы не поверите, есть такая память — назыается RAM, и она конечна.

какое отношение имеет RAM к куче? RAM это физтическое представление памяти, есть еще логическое, которое потом средствами ОС мапиться на реальные адресса, так вот логическое делиться на всякие интересные области, и вроде хип там тож есть...

или эмбедет обычно работает с реальными адрессами?

msdn.microsoft.com/...-us/library/984×0h58 (v=VS.71).aspx

тут как бы говорят что есть стек между регистрами

All arguments are widened to 32 bits when they are passed. Return values are also widened to 32 bits and returned in the EAX register, except for 8-byte structures, which are returned in the EDX: EAX register pair. Larger structures are returned in the EAX register as pointers to hidden return structures. Parameters are pushed onto the stack from right to left.
The compiler generates prolog and epilog code to save and restore the ESI, EDI, EBX, and EBP registers, if they are used in the function.

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


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

Мусчина, вы не поверите, есть такая память — назыается RAM, и она конечна.


надеюсь вы под стеком не имели ввиду стек вызова функции? или для эмбедед параметры передаються как-то иначе?

Аби большинства РИСК архитектура определяют передачу параметров в регистрах. Но думаю здесь речь не об этом:)

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

2юджин

барахло, неявно генерирующее неопределенные расходы хипа и стека, здесь недопустимо

надеюсь вы под стеком не имели ввиду стек вызова функции? или для эмбедед параметры передаються как-то иначе? /*я действительно не сильно шарю в эмбедед*/

goto нормальное дополнение к такой вот конструкции с++ так как нет нормального finally при return

define finally(__Cleanup_Finally_Block) \
catch ( ... ) \
{ \
__Cleanup_Finally_Block \
throw; \
} \
__Cleanup_Finally_Block

Использовать так

try{
//new memory
//do something
if (Fail) goto fin;
//do something

fin:;
}finally(
//clean
delete xxx;
)

Народ, тут хотя бы половина понимает, что пишет? Это эмбеддед устройство, с ограниченным количеством памяти, свопа нет, поэтому все это это высокоуровневое барахло, неявно генерирующее неопределенные расходы хипа и стека, здесь недопустимо. С точки зрения embedded C++ этот код близок к идеальному.

Ну, а что тут удивляться. Видимо документацию отдали в аутсорс и ее писали нашинские высококвалифицированные тимлиды.

В первом примере можно было использовать смарт-поинтеры, но в Самсунге о них видимо ничего не знают, зато знают как работают функции atoi и itoa изнутри, а это куда важнее:)

возвращаемое значение это ещё что, там до возврата эксцепшн будет при вызове delete 0, для переменных pBitmap, pBuffer и pFile:)

Хорошо быть анонимом. Можно спокойно нести чушь:)

По теме — согласно стандарту, delete 0 это no-op. Посему такой вызов абсолютно легитимен.

возвращаемое значение это ещё что, там до возврата эксцепшн будет при вызове delete 0, для переменных pBitmap, pBuffer и pFile:)

огосспади, ну шо это за бред... % (

ну зачем писать того чего не знаеш?

Слабенький код, конечно. Выделения памяти не проверяются, из функции возвращается либо код успеха, либо код полученный при записи файла (даже если по пути не выполнились какие-то функции).
Eсли запрещено использование исключений (у эмбедов бывает довольно часто) — такой вариант использования «гоуту», эмулирующий исключения с обработчиком, вполне легитимен.

П.С. Впрочем, это же примеры использования АПИ — для такого вполне покатит. Главное, показать с какими параметрами и в какой последовательности вызываются АПИшные функции. К тому же, эти примеры, возможно, низкооплачиваемые «недопрограммисты» (составители документации) писали.:)

2 junior_dev

Самсунг не реализовал SEH для своей ОС

Ну так жаба задавила платить прогерам, вот пусть теперь на грабли и наступают.Главное что бы это не использовалось в президентском чемоданчике

2Dev.Net — на C# без него жить можно, у меня тоже за последние 5 лет его использования ни разу появилось надобности, так как все таки затрудняет чтение кода, но альтернотивой паттерна try-finally в C/C++ без goto может быть разве что RAII (обернуть все обьектом и использовать scope+destructor), но тут зависит от маштаба проблемы ведь иногда и bubble sort достаточен, а тут он так же использован в таком же контексте

скорее всего это можно попробывать обьяснить тем что SEH это фича платформы, а С++ исполняеться нативно и поэтому нельзя получить унифицированого представления поэтому это реализуеться в специализированых компиляторах итд... и наверное Самсунг не реализовал SEH для своей ОСи, вот к примеру как это для Винды

The try-finally statement is a Microsoft extension to the C and C++ languages that enables 32-bit target applications to guarantee execution of cleanup code when execution of a block of code is interrupted.

msdn.microsoft.com/...ibrary/9xtt5hxz (VS.71).aspx

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

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

Может логика кода подразумевает что пустой буфер для картинки это не ошибка, а просто easy case — nothing to do?

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

2 JBM
Понять не сложно, изначально было присвоено успешное состояние без его сброса перед goto, хотя как ты правильно подметил его надо изначально инициализировать кодом ошибки. Это серьезно, так как уводит проблему от источника ее возникновения дальше по коду. Но думать, что Самса что-то потеряла в твоем лице наивно.

PS: по ходу у них и тестировщик дерьмовый.


А в какой версии delete NULL; возвращает exception?

например есть кучу статей об обратном blog.voidnish.com p=127

это всё конечно если они не переопределили delete, в теле которого есть проверка на ноль, что может обычно использоваться в дебаг версиях операторов.

2РЖУНИМАГУ
А в какой версии delete NULL; возвращает exception?

например есть кучу статей об обратном blog.voidnish.com p=127


нотариально заверенный скриншот № 1: s005.radikal.ru/...3089f00fcb6.png
Сначала я поперхнулся чаем увидев goto в С++ коде. Но это ладно — на самом деле если использовать goto аккуратно и грамотно, то проблем можно избежать. Мы ведь знаем что в Самсунг набирали только лучших из лучших, поэтому им это по плечу. Но зачем давать такие опасные вещи в официальной документации? Ведь неизвестно кто будет писать код по таким докам, далеко не всегда это будут профессионалы.
Обратите внимание на два goto в красных квадратиках. В случае ошибки будет переход на CATCH, однако возвращаемое значение E_SUCCESS. Бага в официальном примере. Блин, ребята, ну это же позорище...
возвращаемое значение это ещё что, там до возврата эксцепшн будет при вызове delete 0, для переменных pBitmap, pBuffer и pFile:)

это всё конечно если они не переопределили delete, в теле которого есть проверка на ноль, что может обычно использоваться в дебаг версиях операторов.

А что плохого в первом скрине кроме того что 2 оператора разместили в одной строке и может быть не удобно дебажиться?

не всегда можно использовать блоки try-finally в С++ и поэтому goto это единственый способ избежать запутаных условий на очистку ресурсов

check before saying:
Standard 6.6 \ 2

Jump statements

On exit from scope (however accomplished), destructors are called for all constructed objects with automatic storage duration that are declared in that scope, in the reverse order of their declaration.

Підписатись на коментарі