На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
  
> C vs C++
    Посты Зачем люди пишут на чистом С ? и Приведение типов подтолкнули на создание темы.
    Высказывайтесь :)
      С - когда программа модульная, С++ - для программы с классами :)
      А вообще, в С++ много замечаельных нововведений - хотя бы new и delete, значительно лучше чем malloc() и free().
      А также стандартная библиотека - она ведь основана на классах!
        Цитата

        С - когда программа модульная, С++ - для программы с классами :)

        Я не уверен в таком разделении :yes: .
          BugHunter, почему?
            Цитата
            А вообще, в С++ много замечаельных нововведений - хотя бы new и delete, значительно лучше чем malloc() и free().
            А также стандартная библиотека - она ведь основана на классах!

            Сомнительный плюс. Когда парадигму толкают не разобравшись, потом бывают проблемы.
              Цитата Ho Im @
              Сомнительный плюс. Когда парадигму толкают не разобравшись, потом бывают проблемы.

              Подробнее, плз...
                Цитата Alexander RUS @
                BugHunter, почему?

                Если я в своей (простенькой) программе использую шаблонные классы vector<> и т.п. (которые писал не я) - считается ли это программа программой с классами? Если я разбиваю программу на С++ на несколько длл-ек - она перестаёт быть модульной от того, что написана на С++ ? Вообще то практика показывает, что любой большой проект лучше бить на модули. Так и команде работать проще.

                Я бы сделал разделение по объёму. Если проект превышает ххх килострок, то его лучше переписать на С++. О велечине ххх идут споры, но она не очень велика.

                Цитата

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

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

                Ho Im, я вас умоляю, ваш фанатизм позволяет мне думать, что вы неправы. Почитайте Гегеля. А именно: всё что он пишет о диалектике. Отрезвляет, знаете ли.
                  Я, как правило, о таком:
                  Цитата
                  А вообще, в С++ много замечаельных нововведений - хотя бы new и delete, значительно лучше чем malloc() и free().
                  А также стандартная библиотека - она ведь основана на классах!

                  Вот здесь я вижу почти что фанатизм. Лично не вижу преимуществ в том, что стандартная библиотека основана на классах. Чему-то это помогает, но панацеей от красных глаз не является. Как говаривал небезызвестный БГ, "некоторые вещи я могу спеть только на русском, некоторые -- только на английском". Напротив, неудачную процедурную модель еще можно переделать (с той же моделью данных), но неудачная ОО-модель... Упаси Аллах.

                  Я понимаю, что менеджменту ужасно нравится -- до мурашек по спине -- когда им говорят, что аппликация реализуется "с классами". Но все-таки, стоит спуститься на землю, и признать, что, например, функциональный стиль в C++ -- это скорее костыль. А для ряда задач лучше него не сыщешь.

                  То есть, это не есть плохо. Но явного превосходства в "библиотеке на классах" и "new и delete", по непонятно каким критериям "лучшим", нежели malloc(3) и free(3), я таки не вижу.

                  Тем более, когда определенная парадигма навязывается языком -- это уже не плюс. И не ноль. Это минус.
                    Цитата Ho Im @
                    Тем более, когда определенная парадигма навязывается языком -- это уже не плюс. И не ноль. Это минус.

                    Ткни пальцем - в каком месте эта парадигма навязывается? Или ты хочешь сказать, что программируя на С++ я не могу использовать функциональный стиль? Тогда ты в корне неправ.
                    Цитата Ho Im @
                    Лично не вижу преимуществ в том, что стандартная библиотека основана на классах.

                    Приемущество хотя бы в обобщенности кода. Причем на разных уровнях - как на уровне самой библиотеки, так и на уровне ее использования. И не надо говорить о #define-ах. Шаблоны и дефайны - совершенно разные вещи. Даже рядом не стоят.
                    При этом даже использование стандартной библиотеки не заставляет тебя проектировать собственный код с использованием классов. Теже самые шаблоны прекрасно работают с POD-типами. А свободные функции - они и в африке свободные функции. Итог - не хочешь программировать с использованием ОО-парадигмы - да сколько угодно. Языку и библиоеке это совершенно по барабану.

                    Добавлено
                    Цитата Ho Im @
                    "new и delete", по непонятно каким критериям "лучшим", нежели malloc(3) и free(3), я таки не вижу.

                    Гм. Ну как бы так сказать... При использовании new тебе не надо явно указывать размер создаваемого объекта (это сделает сам компилятор), не надо явно вызывать функцию инициализации (компилятор сам вызовет подходящий конструктор). delete сам вызовет функцию деинициализации (деструктор). Ты можешь явно переопределить new и delete для конкретного типа (при этом клиенсткий код останется неизменным). Хочешь сказать, что при использовании malloc и free ты получаешь такой же сервис?
                      Цитата
                      Хочешь сказать, что при использовании malloc и free ты получаешь такой же сервис?

                      Я получаю более легкий runtime, цепляющийся к программе, если эти вещи не нужны.
                      Цитата
                      Или ты хочешь сказать, что программируя на С++ я не могу использовать функциональный стиль?

                      Да все можно. Вон на васике ось пишут... Но -- будет ли это удобно?
                        +) используя new мы получаем очень удобный "откат назад" (Стандарт гарантирует, что всё вернётся взад) если вдруг при конструировании 4256 объекта вдруг что то сломалось. Это получается автоматом, без лишних телодвижений.
                        +) операторы new / delete удобно перегружаются для отдельных классов, если нас не устраивает стандартный менеджер памяти.
                        +) такая вещь, как "типы данных, похожие на стандартные", для которых перегружены операторы +, -, *.

                        Вообще мощь С++ складывается из 3 вещей.
                        1) перегрузка
                        2) шаблоны
                        3) наследование
                        4) namespaces
                        5) параметры по умолчанию: нет нужды переписывать переколбашивать весь проект, елси в функцию добавится параметр
                        6) более строгая типизация

                        т.о. видно, что С++ лучше подходит для КРУПНЫХ проектов.

                        Цитата

                        Я получаю более легкий runtime, цепляющийся к программе, если эти вещи не нужны.

                        ну, не нужны, так не нужны. в наше время скорость рантайма приносится в жертву лёгкости отладки и сопровождения.
                        К тому же, если всё в порядке, то скорость не сильно хуже.
                          Цитата Ho Im @
                          Я получаю более легкий runtime, цепляющийся к программе, если эти вещи не нужны.

                          А что, в С++ malloc и free уже отменили? :blink: :blink: :blink:
                            Цитата Flex Ferrum @
                            А что, в С++ malloc и free уже отменили? :blink: :blink: :blink:

                            ДА нет! Это изжиток С... :rolleyes:
                              Вот, нашел интересное масло для огня:
                              Why C++ Sucks
                              Why C++ Sucks

                              Искал сходные материалы по C, не нашел.
                                Цитата

                                Искал сходные материалы по C, не нашел.


                                1) С не сакс, просто он немного... для другого.
                                2) С сакс потому что смотри мой пост от Вчера, 19:41
                                3) Категоричность статей позволяет мне думать, что авторы заблуждаются.

                                называть кого то гадом, козлом и уродом - это значит, что все НОРМАЛЬНЫЕ аргументы уже иссякли. А это значит, что их нет. Ну нету в С адекватного ответа namespace-ам, шаблонам, и перегрузке. И это мы ещё не дошли до классов, операторов и т.п. полиморфизму!

                                Я так понимаю, С не может быть саксом, потому что это часть С++.

                                Ho Im - вашу бы энергию, да против Дельфи ;) :lool:
                                  BugHunter, учти плз, что там только заголовок такой. Сами статьи, вопреки моим же ожиданиям, намного сдержаннее. Это русские шашечкой помахать любят. :)

                                  Добавлено
                                  Цитата
                                  6) более строгая типизация

                                  В первой из статей насчет типизации хорошо сказано: строгая типизация приводит к большему количеству typecast'ов там, где они нужны, а это создает еще большее количество скрытых багов. GCC же, например, тип преобразует, но всегда (если не отключишь ключиком командной строки) честно предупредит, мол, тут у тебя неявное преобразование, гляди в этот кусок года внимательней, если что...

                                  Проблема не в самих typecast'ах, а в том, что программист к ним приучивается так же, как мы рефлекторно не замечаем рекламные баннеры на сайтах.

                                  Добавлено
                                  Цитата
                                  Ho Im - вашу бы энергию, да против Дельфи ;) :lool:

                                  Да там и говорить нечего, все и так знают, что это сакс :lool:
                                    Цитата Ho Im @
                                    BugHunter, учти плз, что там только заголовок такой. Сами статьи, вопреки моим же ожиданиям, намного сдержаннее. Это русские шашечкой помахать любят. :)

                                    Ну читал я их, читал. Да, в принципе, всё здраво. Но сразу называть саксом - хм. Мдя.
                                    Во всех этих спорах пропускают как правило ключевое слово: "..для моих задач". Вот.

                                    зы. Я знаю всего пару языков программирования, которые можно было бы однозначно назвать саксом. И то - не окончательно. ;) С правом реабилитации, так сказать :D
                                    И то они не получили широкой известности :yes:

                                    Цитата

                                    Это русские шашечкой помахать любят. :)

                                    то то я думаю: "а почему я шашкой махать не люблю?".
                                      Цитата
                                      то то я думаю: "а почему я шашкой махать не люблю?".

                                      Я о том, что даже на слэшдоте, где, по мнению буржуев, "полно хулиганья", народ не пускает в ход таких сильных аргументов, как на linux.org.ru, например. Я пришел на слэшдот, так там народ в сравнении вообще сплошь дамы и джентльмены :)

                                      Ладно, проехали... Лучше поговорим о том, почему C++ сакс. :)

                                      Добавлено
                                      Цитата
                                      Но сразу называть саксом - хм. Мдя.

                                      Учти, пожалуйста, что это не столько ради контента, сколько для того, чтобы гугелем легче найти... Лучше броский и яркий заголовок.
                                        Цитата Ho Im @
                                        Лучше поговорим о том, почему C++ сакс. :)

                                        Ну так и почему же?
                                          Цитата Ho Im @
                                          Да там и говорить нечего, все и так знают, что это сакс :lool:

                                          Правильно сказал BugHunter:
                                          Цитата BugHunter @
                                          зы. Я знаю всего пару языков программирования, которые можно было бы однозначно назвать саксом. И то - не окончательно. ;) С правом реабилитации, так сказать :D
                                          И то они не получили широкой известности :yes:

                                          Советовал бы не забывать, что мир Python'ом и C не ограничен ;)
                                            При работе в С ощущается дискомфорт из-за отсутствия:
                                            - объявления переменных в блоках;
                                            - спецификации const;
                                            - ссылок;
                                            - классов (хотя их как-то еще можно заменить структурами).

                                            Но и в С++ есть недостающие возможности, как например, создание массива объектов конструктором с параметрами.
                                            Хотя больше в С++ излишеств..
                                              - Объявления переменных блоках в C есть. Просто делать их надо в самом начале.
                                              - Спецификация const тоже есть, хотя и немного с другой семантикой, нельзя например использовать такую константу, как размер массива. И по-моему семантика C немного логичнее с точки зрения реализации.
                                              - Ссылок нет. Хотя иногда ссылки становятся кошмаром C++. Если их не к месту использовать.
                                              - Классов нет. Структуры их заменяют лишь частично.

                                              А ещё:
                                              - нет перегрузки функций и операций, параметров по умолчанию.
                                              - нет виртуальных методов. Хотя существуют методики реализовать нечто подобное.
                                              - нет inline-функций. Макросы кое-чего сделать не позволяют. Ну это мелочь, если не заботиться об суперскоростях.
                                                Цитата

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


                                                ну, для пользователя функции / класса передача в функцию аргумента как константной ссылки гораздо удобнее, чем передача указателя на константу :yes:.
                                                  Аргумент-константная ссылка аналога в C вообще не имеет, так как заменяет передачу значения (когда оно не меняется внутри функции).
                                                  Кстати, возможное расширение семантики для C++, при попытке изменить объект, указуемый константной ссылкой параметром, заводить временный объект-копию и дальнейшие действия осуществлять с ним.
                                                    Цитата amk @
                                                    - нет inline-функций.

                                                    RTFM (C99 draft, например)
                                                      Цитата

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

                                                      а вот этого нам не надо. Это ж не вижуал бейсик, а не С++!! :wall:
                                                        Прочитал сегодня эти статьи про "почему C++ sucks". Ничего серьёзного. Так....
                                                        "самая большая ошибка - это обратная совметимость с С"
                                                        написавший ЭТО чел видимо был не в курсе, что зарождался С++ как средство улучшения производительности труда С программистов. Т.е. новый компилятор должен был свободно компилировать КУЧУ (метры, километры и световые года) исходников на С. А что же с ними ещё делать было? Выбрасывать?...
                                                        Кстати, один из довольно хороших способов найти ошибки в проге на С - это откомпилировать её хорошим С++ компилятором. Помогает :yes:.
                                                          Гусары, а как вам поинтер на void???? ;) Далеко не всегда, я бы даже сказал редко понятно как к нему прилабуниваться... :whistle:
                                                            Цитата Rikkie @
                                                            Гусары, а как вам поинтер на void???? ;) Далеко не всегда, я бы даже сказал редко понятно как к нему прилабуниваться... :whistle:

                                                            К счастью, использования void* часто можно заменить шаблонами, либо грамотным использованием полиморфизма. А вот там, где это необходимо: например при использовании Win32API фукнций CreateThread и т.д. C++ совершенно не при чём, т.к. это - часть АПИ операционной системы. Так что неча :tong:
                                                              Цитата Rikkie @
                                                              Гусары, а как вам поинтер на void???? ;)

                                                              Я к нему равнодушен! И че же там не понятного?
                                                                Цитата BugHunter @
                                                                А вот там, где это необходимо: например при использовании Win32API фукнций CreateThread и т.д. C++ совершенно не при чём, т.к. это - часть АПИ операционной системы. Так что неча :tong:

                                                                Ну тут уже вопрос не стоит о том, как было бы лучше сделать. Эт уже сделано. Т.ч. приходится юзать то, что есть.
                                                                  Цитата
                                                                  Я к нему равнодушен! И че же там не понятного?

                                                                  Я же считаю, что это одна из самых гениальных (после колеса, пива и бутербродов, конечно) вещей, когда-либо придуманных человечеством.
                                                                    Цитата Ho Im @
                                                                    Я же считаю, что это одна из самых гениальных (после колеса, пива и бутербродов, конечно) вещей, когда-либо придуманных человечеством.

                                                                    Что тут гениального, когда неизвестно о том, с чем работаешь??? Пан-то различает поди, что в рот кладет... :)
                                                                      Цитата

                                                                      Я же считаю, что это одна из самых гениальных


                                                                      Мсье знает толк в удовольствиях :yes:

                                                                      В С++ на замену средневековой методике сувать везде void* придуманы шаблоны.
                                                                        Да используется (в Си) void* обычно там, где либо известно, что в нём находится, либо это попросту не имеет значения.
                                                                          А как мусью обозвет указатель на функцию?
                                                                            Вот указатель на функцию - как раз инструмент грамотный. Скажем, часто техника проектирования на плюсах использует такую фичу. Оч удобно для индексированного вызова. Вынужден согласиться, что в чисто плюсовом варианте это выглядело бы гораздо муторнее, но не зря же плюсы позволяют это использовать...
                                                                              Цитата Ho Im @
                                                                              А как мусью обозвет указатель на функцию?

                                                                              ExpandedWrap disabled
                                                                                int f(void)
                                                                                {
                                                                                  return 12;
                                                                                };
                                                                                 
                                                                                typedef int (*fp)(void);    
                                                                                fp tmp = f;


                                                                              не понимаю, зачем ЗДЕСЬ void* ?...
                                                                                Вообще то, в С++ есть, конечно же, вещи, которые кажутся ну очень странными.
                                                                                В эту категорию, например, можно отнести требования на параметры шаблона :(
                                                                                overloading resolution - тоже весьма нетривиальная штука (особенно если злоупотреблять), особенно что касается перегрузки операторов :yes:
                                                                                ну и довольно ублюдочная система public / protected / private и друзей.
                                                                                  Цитата BugHunter @
                                                                                  В эту категорию, например, можно отнести требования на параметры шаблона

                                                                                  Подробнее
                                                                                  Цитата BugHunter @
                                                                                  ну и довольно ублюдочная система public / protected / private и друзей.

                                                                                  Подробнее.

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

                                                                                    В эту категорию, например, можно отнести требования на параметры шаблона
                                                                                    Подробнее

                                                                                    почему, например, double не может быть парамтером шаблона? Почему строка (которая не external-linkage) не может быть параметром шаблона?.. Мне это не понятно.

                                                                                    Цитата

                                                                                    ну и довольно ублюдочная система public / protected / private и друзей.
                                                                                    Подробнее.

                                                                                    Ну, напиример, шаблон не может быть другом (по Стандарту, в VS2003 может). Исключительно специализация.
                                                                                    Ключевое слово protected тоже такое... непонятное. Особенно protected наследование.
                                                                                      Цитата BugHunter @
                                                                                      Ключевое слово protected тоже такое... непонятное. Особенно protected наследование.

                                                                                      А чем же оно не понятно?

                                                                                      Цитата BugHunter @
                                                                                      почему, например, double не может быть парамтером шаблона? Почему строка (которая не external-linkage) не может быть параметром шаблона?.. Мне это не понятно.

                                                                                      В какой то из умных книжек по шаблонам это объяснялось...

                                                                                      Цитата BugHunter @
                                                                                      Ну, напиример, шаблон не может быть другом (по Стандарту, в VS2003 может). Исключительно специализация.

                                                                                      Думаю, что здесь дело в защите от несанкционированного доступа. Если можно было бы делать другом весь шаблон, то злоумышленнику бы ничего не стоило написать свою специализацию такого шаблона и получить доступ к закрытым частям класса. Оно так надо?
                                                                                        Цитата

                                                                                        В какой то из умных книжек по шаблонам это объяснялось...

                                                                                        угу, кажется у "Вандервуд / Джосъютис-а".

                                                                                        Хм. Ну да.. Я всё понимаю, всё правильно, и даже причины я знаю.
                                                                                        Но ОТДЕЛЬНЫЕ моменты мне кажутся... нелогичными. А так - всё довольно вкусно :)
                                                                                          Цитата BugHunter @
                                                                                          Почему строка (которая не external-linkage) не может быть параметром шаблона?

                                                                                          А потому, кстати, и не может - что internal linkage и представление в памяти не определено (точнее - implemetation defined).

                                                                                          Добавлено
                                                                                          Цитата BugHunter @
                                                                                          Но ОТДЕЛЬНЫЕ моменты мне кажутся... нелогичными.

                                                                                          Есть такие. Как то, например, export для шаблонов... Некоторые чудеса с перегрузкой, friend-объявлениями и объявлениями вообще. Но, честно говоря, все это лежит несколько в стороне от предмета спора, ибо надо очень постараться, чтобы написать на С++ программу, ставящую "раком" компилятор из за того, что напарывается на ошибки в нем. 90% (если не больше) С++-программ гораздо проще. :)
                                                                                            Ага, в этом, наверное, беда C++ - пока не можем ДОСТАТОЧНО ВЫСОКО оторваться от implementation :yes:
                                                                                            Т.е. по началу поглядели на текущие компиляторы (тогда С) и добавили кое каких полезных фишек (уж каких смогли). Я бы, возможно, сразу проектировал язык с "идеальными" возможностями, а уж потом подгонял РЕАЛИЗАЦИЮ под задумку. Согласись, double парамтеры шаблона были бы логичными (а так приходится извращаться с traits-ами). Ну знаю, куда бы я таким образом доехал :D.

                                                                                            Добавлено
                                                                                            Цитата

                                                                                            90% (если не больше) С++-программ гораздо проще. :)

                                                                                            ну значит, я добрался наконец до тех 10% :D
                                                                                              Цитата BugHunter @
                                                                                              Ага, в этом, наверное, беда C++ - пока не можем ДОСТАТОЧНО ВЫСОКО оторваться от implementation

                                                                                              Ну, не знаю - надо бы заглянуть в кулуары коммитета по стандартизации и посмотреть - чего же там они готовят? Тут, кстати, столкнулся с тем, что очень неплохо былобы, чтобы enum-ы были полноценными классами. Ибо когда делаешь очередное перечисление, элементы которого суть флаги, и для них нужно перегружать операторы типа |=, |, &, и сделать их можно только внешними... В итоге, конечно, нарисовал шаблонный классец SetOfFlags, но что-то мне подсказывает, что это не очень хорошее решение...

                                                                                              Добавлено
                                                                                              Цитата BugHunter @
                                                                                              ну значит, я добрался наконец до тех 10%

                                                                                              "Поздравляю - вы перешли на следующий уровень!"
                                                                                                Цитата Flex Ferrum @
                                                                                                Тут, кстати, столкнулся с тем, что очень неплохо былобы, чтобы enum-ы были полноценными классами.
                                                                                                Цитата
                                                                                                36. Extend enum types
                                                                                                Section: 7.2 dcl.enum Status: open Submitter: Date: unknown

                                                                                                (Previously numbered ES029, ES030, ES034, ES050, ES051, and ES074.)

                                                                                                References: N1579 (Herb Sutter).
                                                                                                ...
                                                                                                Straw polls: Directions for semantics
                                                                                                ...
                                                                                                special member functions (ctors, op=)?
                                                                                                SY: 6 WY: 2 WN: 4 SN: 10
                                                                                                ...


                                                                                                Цитата BugHunter @
                                                                                                почему, например, double не может быть парамтером шаблона? Почему строка (которая не external-linkage) не может быть параметром шаблона?

                                                                                                Цитата
                                                                                                34. Nontype template arguments: Allow floating-point and string constants
                                                                                                Section: 14 temp Status: suggestion Submitter: Date: unknown

                                                                                                (Previously numbered ES027.)

                                                                                                Some compilers already support floating-point nontype template parameters.
                                                                                                :)

                                                                                                P.S. SY - strong yes("определенно да").
                                                                                                WS - weak yes("возможно")
                                                                                                WN - weak no("нежелательно")
                                                                                                SN - strong no("определенно нет")

                                                                                                P.P.S. Это по состоянию на 9 сентября 2004.
                                                                                                  Ну для enum'ов, как для стандартных средств, можно было бы предусмотреть и стандартные операции.
                                                                                                  Хотя нормальный контроль типов им не помешал бы.
                                                                                                    Флейм утих, но я тут кое-что нашел. Понимаю, что это, конечно, хохма, но местами очень на правду смахивает: http://cs.mipt.ru/docs/comp/rus/develop/ot...trup_interview/
                                                                                                      Ну это очень старая шутка. :) Разумеется, Страуструп такого интервью не давал. :) Он даже сам это опровергал в ответе кому-то.
                                                                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                                      0 пользователей:


                                                                                                      Рейтинг@Mail.ru
                                                                                                      [ Script execution time: 0,0920 ]   [ 16 queries used ]   [ Generated: 26.04.24, 06:20 GMT ]