То то я смотрю, что существовали/существуют Windows Server, Windows CE, Windows Mobile и Windows Phone. Так что там у тебя за операционные системы? Будет канеш немного забавно, если окажется, что это - системы на базе Linux/Unix. --- Сообщение объединено, 23 мар 2021 --- Лол! Есть даже: https://ru.wikipedia.org/wiki/Windows_Embedded
https://www.renesas.com/us/en/software-tool/hi70004-real-time-os-superh-family Забавно не получилось.
Microedition, Так не делай goto cleanup. Код можно переструктурировать так, что все ветки сами собой в cleanup придут, без всяких вынужденных прыжков.
В GCC есть attribute cleanup, но это расширение и стандартом не является. Но да defer давно пора было бы добавить, но это же сишечка, она для спецов сделана, а спецы любят мучать себя без повода.
Когда оставляют от плюсов "си-с-классами" и отказываются от всего того говна, где шаблон на шаблоне и шаблоном погоняет с перегрузкой всего, что только позволяет синтаксис. Говнокодинг роняет производительность кода. Когда безусые сеньоры девелоперы надеются на компиль, чтоб сам там при выходе из функции все почистил и отхендлил. При использовании ООП в чистой сишке, ты по-прежнему управляешь ресурсами и потоком выполнения сам, ничто не будет выполняться невидимо под капотом неподвластно твоему контролю и желанию оптимизировать Ну, писать функции в которых всего один return и ни одного goto - это привычное дело и никаких проблем не доставляет. И когда этому научишься, никакой defer и нахой не нужон будет Мучением это является лишь для любителей петонов и растов.
Для спецовых цэшников это нормально, написал код один раз и не смотришь на него никогда больше. Ну ты же знаешь этих наших спецов - они же идеальные, всегда с первого раза все четко пишут, без всяких там андефайн бихейвиор, буффер оверфлоу и юз афтер фри и тд. Один раз написал и все, читать и вспоминать, что ты там наговнокодил не нужно. Тем более, когда твой код используешь только ты сам, никто тебе никаких багов не зарепортит, если что.
Ну вот буквально первый попавшийся пример: https://github.com/torvalds/linux/b.../testing/selftests/cgroup/test_freezer.c#L193 Как бы вы переписали его 1) без дублирования кода, 2) без повышения цикломатической сложности?
rmn, а что с исключениями? RAII тем хорош что деструкторы вызываются автоматом, даже если произошло исключение. Я вообще не понимаю смысл дискуссии - не нравится C++ (или любой другой ЯП) или какие-то его фичи - не используй. Благо на C++ можно писать в С стиле и использовать от ООП минимум. Зачем отказываться от фич если они могут пригодиться? Rel, не понимаю почему ты так хейтишь сишников. С очень удобен в использовать при компиляции прошивок МК и т.п. (правда не знаю есть ли плюсы для МК). Говнокодить можно и на С и на плюсах и на других ЯП. --- Сообщение объединено, 24 мар 2021 --- Microedition, чем плох в данном примере goto? Как раз-таки он и повышает читаемость кода тут.
Или вот более показательный пример: https://github.com/torvalds/linux/blob/7acac4b3196caee5e21fb5ea53f8bc124e6a16fc/fs/ext4/file.c#L773 Как избавиться от goto? --- Сообщение объединено, 24 мар 2021 --- Так я об этом и говорю.
Код (C): static int test_cgfreezer_simple (const char *root) { int i, ret; char* cgroup; ret = KSFT_FAIL; cgroup = cg_name (root, "cg_test_simple"); if (cgroup) { if (cg_create(cgroup)) { for (i = 0; i < 100; i++) cg_run_nowait(cgroup, child_fn, NULL); if (!cg_wait_for_proc_count(cgroup, 100) && !cg_check_frozen(cgroup, false) && !cg_freeze_wait(cgroup, true) && !cg_freeze_wait(cgroup, false)) { ret = KSFT_PASS; } } cg_destroy (cgroup); free (cgroup); } return ret; }
Да я сам так частенько делаю. К примеру есть куча COM объектов (или интерфейсов одного объекта, неважно) и в конце их нужно освободить. Или вот к примеру (вб, но код в стиле С). --- Сообщение объединено, 24 мар 2021 --- Ну это совсем идеальный мир. Исключения могут генерироваться не только тем кодом что ты пишешь. --- Сообщение объединено, 24 мар 2021 --- Не, я отвечал по поводу замены goto как предлагает rmn, а не про defer.
Скажи это вот этому уникому: https://github.com/moon-chilled/Defer/blob/master/defer.h И есть attribute cleanup в GCC/MinGW - не так удобно, как RAII, но все же.
Как это в чем? Чтобы определить раз и навсегда, на чем должен писать весь мир А плюсы я и не использую. Это рел думает, что я не осилил, хотя я намеренно отказался от него в пользу сишечки лет 10 назад, когда увидел, во что его начинают превращать, чтобы угодить подрастающему поколению баранов, не умеющих даже джве строки объединить без переполнения буфера или утечек памяти. В этом мы с ним отличаемся: я знаю оба и могу писать и на том и на другом, а он просто менеджер
И что это корректно работает при исключениях? Нет. Как пример могу тебе привести рантайм VB в котором обрамлены такие места через setjmp/longjmp. Если ты свой код пишешь для себя, и не используешь никакие 3rd-party библиотеки то можешь не включать обработку исключений. https://www.cyberforum.ru/post10058627.html вот наглядный пример я уже привел.
Ну ты имеешь ввиду системное исключение, понятно, что тулзы от мелкомягких умеют их отлавливать (__try и __except в мелкомягких плюсах и обычные исключения в дотнете). Но стандарт ничего про них не знает, например в MinGW в плюсах ты можешь поймать только родное для текущей версии компилятора исключение (для x86 это может быть SjLj или DWARF), и это тупо, я согласен. Особенно когда у тебя две плюсовые либы, которые выбрасывают разные исключения (это канеш редкая утрированная ситуация, но она может быть). Но некоторые языки вполне могут их отлавливать и преобразовывать в свои. Если я ничего не путаю, в Nim исключения построены на SjLj, но при этом еще и отлавливают сигналы юниксовые (про SEH/VEH не могу ничего сказать, не пробовал). Происходит статический анализ кода (включая control flow analysis), анализатор просматривает все возможные места, где происходит чтение/запись элемента массива, анализирует индексы в этих местах, если индексы во все время работы функции попадают в интервал от 0 до array.Length - 1, то все нормально, проверку на обращение за границы массива можно опустить. В частности есть цикл, где i меняется от 0 до array.Length, при этом внутри цикла никто произвольным образом не меняет i, то очевидно, что дополнительная проверка здесь не нужна.
Microedition, Не слушай его. А то будешь так же лишний раз кликать по ссылкам, что читать мои посты и молча все проглатывать, не имея возможности язвительно контратаковать, не разрушив легенду --- Сообщение объединено, 24 мар 2021 --- Но они могут. А то, что называется "безопасным" программированием, на самом деле слепая вера в то, что компиль за всем уследит и ничего не допустит. Но эти компили не так идеальны, как в рекламных постах в соцсетях написано, и баглист говнооси на расте не менее жирный, чем у линукса.