LINUX.ORG.RU

Си с классами

 , ,


0

7

Тупнячка принёс, извиняйте.

Начинаю проект (личный), выбираю на чём писать: C или C++.

Ситуация такая: с плюсами возиться не хочется, да и не знаю я их толком, учил ещё в школе, до сих пор не выучил, но и на чистой сишечке, с другой стороны, писать как-то лениво.

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

Насколько такой суперсет C / сабсет C++ ака «Си с классами» может быть кошерен?

Объясните почему так делать не стоит, либо даже наоборот, предложите уже существующие сабсеты плюсов, которые можно перенять.

Ответ на: комментарий от eao197

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

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

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

anonymous
()
Ответ на: комментарий от byko3y

98% людей субъективно скажут «да»

Опредление истины путем голосования? Миллионы мух не могут ошибаться?

Раз хорошесть определяется по голосованию, то смотрим https://tiobe.com/tiobe-index/

На каком месте C и С++? И на каком месте «хороший язык» F#?

задача создания простого языка подразумевает оценку субъективной оценки

Да ты просто генератор не научных, а художественных «определений». Смени род деятельности на более художественную.

anonymous
()
Ответ на: комментарий от byko3y

Я не повторил твой код

Тогда нехрен разбрасываться утверждениями вроде «А вот как оно будет писаться на Си» и «код даже немного чище и проще, чем твой крестовый».

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

Не в курсе про UE, а вот в Qt сделали свой аналог стандартной библиотеки из-за того, что Qt появилась, когда еще не было ни стандарта C++, ни его библиотеки. Не говоря уже про C++ компиляторы, которые в более-менее приличной степени поддерживали бы грядущий стандар и его stdlib.

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

К многопоточности это имеет лишь то отношение, что в случае многопоточности будет ничуть не лучше, чем и при подобной ошибке в однопоточном коде.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Стандарт крестов какого-то черта включает в себя узкоспециализированные прикладные пакеты, потому аргумент инвалид — «стандарты» несравнимы.

Это еще что за бред?

Потоки, атомарный доступ, регулярные выражения, реализации контейнеров, дата-время сверх сырых системных интерфейсов — этого всего нет в Си.

В C++ вам ничего этого не нужно

Как минимум нужно инстанциировать тип из шаблоного. Подобную роль могут выполнять макросы в Си.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

На каком месте C и С++? И на каком месте «хороший язык» F#?

Они просто не знают, что такое F#. Они живут в пузыре, где есть только C/C++.

byko3y ★★★★
()
Ответ на: комментарий от eao197

Не в курсе про UE, а вот в Qt сделали свой аналог стандартной библиотеки из-за того, что Qt появилась, когда еще не было ни стандарта C++, ни его библиотеки

Qt (1995) создавался уже при наличии STL (1992). Тем более UE, который вышел в один год с C++98.

К многопоточности это имеет лишь то отношение, что в случае многопоточности будет ничуть не лучше, чем и при подобной ошибке в однопоточном коде

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

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Вообще это болезнь любых фреймворков и библиотек по типу «комбайн» но внутри там в основном просто врапперы на тот же stl + немного авторского кода, как например в qt где еще решили помимо с++ итераторов запилить такие как в java, я правда так и не понял для чего… допустим для чего пишутся врапперы я понимаю, а тут логика как будто отсутствует.

anonymous
()
Ответ на: комментарий от byko3y

Они просто не знают, что такое F#. Они живут в пузыре, где есть только C/C++.

Давай, не извращать голосование, пусть избиратели будут выбирать среди кандидатов, а не наоборот, когда кандидаты выбирают избирателей.

anonymous
()

С какой по счету страницы этой флуд болтологии вы приступите к написанию этого проекта ?

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

вооон там мелкими буквами о том что это БАД …. ))))

если решил, то пусть отпишет в теме и закроет ее

anonymous
()
Ответ на: комментарий от anonymous

На лоре нельзя просто так взять и закрыть тему, ну разве что модератору :D

anonymous
()
Ответ на: комментарий от byko3y

Потоки, атомарный доступ, регулярные выражения, реализации контейнеров, дата-время сверх сырых системных интерфейсов — этого всего нет в Си.

И?

Как минимум нужно инстанциировать тип из шаблоного.

Не нужно. Инстанциирование происходит автоматически.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Qt (1995) создавался уже при наличии STL (1992). Тем более UE, который вышел в один год с C++98.

Молодой человек, Qt начали разрабатывать несколько раньше 1995-го. А 1992-й – это год, когда STL (которая даже тогда расшифровывалась не как Standard Template Library) еще только-только задышала у Степанова и Ли. И еще даже речи о включении ее в стандарт C++ не зашло.

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

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

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Можно кстати пойти и посмотреть на архивной помойке, на реализацию qt версии 1.41, это самое старое что там есть, но даже в ней еще и тени использования stl нет, свои наколенные контейнеры, документация в doc, примеры кода смесь с и с++. Кому из вас двоих больше не лень можете отследить тот момент когда qt писцы перестали велосипедить.

anonymous
()
Ответ на: комментарий от eao197

Ну вот когда эта нашлепка будет частью языка, тогда и можно будет что-то обсуждать. Пока можно лишь повторить то, что union в Си – это полуфабрикат, а не самодостаточный тип, вроде C++ного std::variant.

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

По этой причине с этой позиции невозможно принять такой аргумент.

anonymous
()
Ответ на: комментарий от byko3y

Вот потому комитетные вахтеры и не могут создать хорошего ЯП.

Да ну, часть людей из комитета крутые.

Как тебе последняя деятельность Саттера: https://imgur.com/a/VIbtfzk

Уже работает:

  • Lifetime checker который уже работает в MSVC

  • <=> operator в С++20

Ещё не работает:

  • Metaclasses

  • Static Exception

  • Function Parameters

fsb4000 ★★★★★
()
Ответ на: комментарий от byko3y

Потоки, атомарный доступ, регулярные выражения, реализации контейнеров, дата-время сверх сырых системных интерфейсов — этого всего нет в Си.

Почитай https://en.cppreference.com/w/c

Найдёшь для себя много нового…

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

хороший (продукт)

крутой (производитель)

Подмена качества продукта (хорошесть) качеством производителя (авторитетом).

anonymous
()
Ответ на: комментарий от byko3y
let res arg =
    result {
        let! r = doJob arg
        let! r2 = doJob2 r
        let! r3 = doJob3 r2
        return r3
    }

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

А можешь разжевать, что там происходит?

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

А можешь разжевать, что там происходит?

Насколько я понимаю, типа такого:

std::variant<T2, Error> res(T arg)
{
    auto r = doJob(arg);
    if (std::holds_alternative<Error>(r)) return std::get<Error>(r);

    auto r2 = doJob2(r);
    if (std::holds_alternative<Error>(r2)) return std::get<Error>(r2);

    auto r3 = doJob3(r2);
    if (std::holds_alternative<Error>(r3)) return std::get<Error>(r3);

    return r3;
}
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 3)
Ответ на: комментарий от anonymous

свои контейнеры много кто писал (в прошлом веке) потому что стандартных не было или они были не так развиты как сейчас. ну типа по спеке-то они может и были, но реализации стл какбы не было в тулчейне.

это особенность с++: реализация стл - это такой же код на с++ как и всё остальное, каждый может написать свою стл, ну люди и пишут. для с++20 например написали ренжи на с++14 и они юзабельные.

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

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

anonymous
()
Ответ на: комментарий от anonymous

Можно кстати пойти и посмотреть на архивной помойке, на реализацию qt версии 1.41

Там как была самопалка, так и осталась. Да, она перерабатывалась серьезно за это время, но велосипедить они не переставали.

byko3y ★★★★
()
Ответ на: комментарий от fsb4000

Почитай https://en.cppreference.com/w/c

Я тебя удивлю, но в MSVC 2015 нет подержки C11. То есть, прием новых стандартов в сишном мире идет еще более туго, чем в крестовом.

byko3y ★★★★
()
Ответ на: комментарий от DarkEld3r

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

А можешь разжевать, что там происходит?

Происходит примерно следующее:

let res arg =
    match doJob arg with
    | Error e -> Error e
    | Ok r ->
        match doJob2 r with
        | Error e -> Error e
        | Ok r2 ->
            match doJob3 r2 with
            | Error e -> Error e
            | Ok r3 -> Ok r3

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

byko3y ★★★★
()
Ответ на: комментарий от anonymous

это особенность с++: реализация стл - это такой же код на с++ как и всё остальное, каждый может написать свою стл, ну люди и пишут. для с++20 например написали ренжи на с++14 и они юзабельные...
это же преимущество с++, что ты можешь написать стандартную библиотеку с нуля, значит язык тьюринг-полный

Ты пробовал когда-нибудь читать библиотеку крестов? Те же ренжи, например? В этом и причина их появления — они абсолютно нечитаемы, даже опытный крестовик с трудом разбирается в их содержании. Поэтому фокус внимания смещается на переиспользование либ, на которые уже потратили огромные усилия. Для справки: вся прокладка Akka.F# весит около 700 строк. Можете убедиться сами:

https://github.com/akkadotnet/akka.net/tree/dev/src/core/Akka.FSharp

Когда у тебя появляются нестандартные требования, то тебе неизбежно приходится писать нестандартные базовые конструкции, вроде тех же контейнеров — и с крестами ты оказываешь в чистом поле, когда хорошая реализация займет вечность, а плохая реализация ничем не лучше сишной. Иенно поэтому в итоге многие люди отказываются от крестовых «преимуществ», чтобы вернуться к простоте и удобству написания опасного кода.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

в qt где еще решили помимо с++ итераторов запилить такие как в java, я правда так и не понял для чего

Именно стиль java является штатным. Потому что Qt позволяет делать легковесные копии, а STL стиль на этом фоне легко приводит к висячим указателям. Итераторы Java не указывают на элементы, а указывают между ними, потому подобной проблемы у них нет.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

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

Избиратели даже не знают, что есть какое-то там голосование. Мамка сказала идти программистом — вот я и пошел.

byko3y ★★★★
()
Ответ на: комментарий от eao197

Потоки, атомарный доступ, регулярные выражения, реализации контейнеров, дата-время сверх сырых системных интерфейсов — этого всего нет в Си.

И?

И это значит, что данные фичи реализовывают библиотеками.

Не нужно. Инстанциирование происходит автоматически

Тебе нужно как минимум написать «std::variant<int, std::string>». А потом еще написать, и еще, и еще. Чем это лучше какого-нибудь макроса «define_variant(int, NULL, char *, free)»?

byko3y ★★★★
()
Ответ на: комментарий от eao197

Молодой человек, Qt начали разрабатывать несколько раньше 1995-го. А 1992-й – это год, когда STL (которая даже тогда расшифровывалась не как Standard Template Library) еще только-только задышала у Степанова и Ли. И еще даже речи о включении ее в стандарт C++ не зашло

В Qt того времени было только пять контейнеров: вектор, очередь, стэк, связанный список, ассоциативный массив. И, тем не менее, STL они использовать не начали. Более того, перешли на итераторы в стиле Java, еще больше отдалившись от STL.

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

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

byko3y ★★★★
()
Ответ на: комментарий от byko3y

И это значит, что данные фичи реализовывают библиотеками.

И?

Тебе нужно как минимум написать «std::variant<int, std::string>». А потом еще написать, и еще, и еще.

Зачем?

Чем это лучше какого-нибудь макроса «define_variant(int, NULL, char *, free)»?

Тем, что у Васи Пупкина свой define_variant, а у Пети Иванова – свой. И никак они друг с другом не связаны.

И это даже не говоря о том, что, как было показано выше, union в Си нихера не АлгТД.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Сам пишешь про «146%» «хороших» голосов. Показал тебе эти «хорошие» голоса. Тебе не нравиться - «мамки» не такие. Не устал скакать?

anonymous
()
Ответ на: комментарий от byko3y

В Qt того времени было только пять контейнеров: вектор, очередь, стэк, связанный список, ассоциативный массив. И, тем не менее, STL они использовать не начали. Более того, перешли на итераторы в стиле Java, еще больше отдалившись от STL.

Скажите честно, вы невменяемый и необучаемый упорыш?

Или вы назло мне них*я не читаете то, что вам пишут?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

И это значит, что данные фичи реализовывают библиотеками.

И?

Вы не сделаете аналоги деструкторов в Си находясь в рамках стандартного Си

И это значит, что быть нестандартным для Си не является чем-то зазорным.

Тебе нужно как минимум написать «std::variant<int, std::string>». А потом еще написать, и еще, и еще.

Зачем?

Использовать std::variant без использования std::variant в коде еще не научились.

Тем, что у Васи Пупкина свой define_variant, а у Пети Иванова – свой. И никак они друг с другом не связаны

А у меня свой std::variant. И дальше что?

byko3y ★★★★
()
Ответ на: комментарий от anonymous

Сам пишешь про «146%» «хороших» голосов. Показал тебе эти «хорошие» голоса. Тебе не нравиться - «мамки» не такие. Не устал скакать?

Ты сравниваешь теплое с мягким. То есть, статистику запросов в гугле против опроса кодеров на C++.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

И это значит, что быть нестандартным для Си не является чем-то зазорным.

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

Использовать std::variant без использования std::variant в коде еще не научились.

А у меня свой std::variant. И дальше что?

Вы вообще в трезвом уме сейчас?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

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

Я уже приводил пример, что MSVC 2015 не поддерживает C11. В какой там версии он начал поддерживать? 2019?

Вы вообще в трезвом уме сейчас?

А ты? Ты предложил переопределить зарезервированный идентификатор первым. То, что зарезервировавший идентификатор дядя вася сидит не в тимлидах, а вахтером в комитете, погоды для проекта не делает.

byko3y ★★★★
()
Последнее исправление: byko3y (всего исправлений: 1)
Ответ на: комментарий от byko3y

Ты пробовал когда-нибудь читать библиотеку крестов?

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

anonymous
()
Ответ на: комментарий от fsb4000

В С++ тоже можно избавляться от лесенок(не совсем то же, но от вложенных if избавляет):
https://gcc.godbolt.org/z/c5r3zj

Ты зря опустил самую интересную часть:

template <typename Arg, std::invocable<Arg> F>
auto operator | (std::variant<Arg,Error>&& a, F&& f)
    -> std::invoke_result_t<F, Arg>
{
   if (std::holds_alternative<Error>(a)) {
       return std::get<Error>(a);
   }
   else {
    return std::invoke(f, std::get<Arg>(a));
   }
}

template <typename Arg, std::invocable<Arg> F>
auto operator | (Arg&& a, F&& f)
    -> std::invoke_result_t<F, decltype(a)>
{
   return std::invoke(f, a);
}

Это если на минутку предположить, что гибкость у этих конструкций сравнима с эфшарповой.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

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

Я вроде уже написал:

Си с классами (комментарий)

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

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Боюсь это проблема не итераторов, а тех кто ими пользуется. Ну и не совсем понятно почему ты их считаешь более «штатными» нежели те, которые похожи на stl вариацию.

anonymous
()
Ответ на: комментарий от byko3y

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

anonymous
()
Ответ на: комментарий от byko3y

Ты сравниваешь теплое с мягким.

А ты что сравниваешь, не желаемое с действительным? У тебя нет ни результатов желаемого, ни результатов действительного. Нечего сравнивать. При этом ты даже сам не знаешь, что хочешь, скачешь в своих желаниях.

Этот индекс по крайней мере показывает популярность запросов.

Эти языки уже выбрали за какие-то качества.

«Выбрали» - это именно проголосовали и ответили за свой выбор. Так как у тебя нет определения «хорошести», и у тебя нет результатов своего опроса желаний (выдаваемых за действительное). То это «голосование ногами» пока самый, что ни на есть, осязаемый и объективный показатель «хорошести».

anonymous
()
Ответ на: комментарий от byko3y

Слой ванильной пудры не смог перебить стойкий запах говна, ну бывает чо… LUL

anonymous
()
Ответ на: комментарий от byko3y

ну я же вроде тоже написал, что это типичная ошибка начинающих.

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

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.