Используя C ++, но не используя специфические особенности языка, следует переключиться на C?

16

Я занимаюсь разработкой эмулятора NES в свободное время. Я использую C ++, потому что это язык, который я использую в основном, знаю в основном и нравится в основном.

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

Я не буду делать это для повышения производительности, это может быть побочным эффектом, но идея в том, зачем мне использовать C ++, если он мне не нужен?

Единственные возможности C ++, которые я использую, - это классы для инкапсуляции данных и методов, но это можно сделать и с помощью структур и функций, я использую new и delete, но могу также использовать malloc и free, и я использование наследования только для обратных вызовов, что может быть достигнуто с помощью указателей на функции.

Помните, это хобби-проект, у меня нет сроков, поэтому время и работа, которые потребуют переписывания, не являются проблемой, а также могут быть интересными. Итак, вопрос в C или C ++?

Petruza
источник
3
Мне кажется, что вы уже ответили себе: зачем использовать C ++, если вам нужен только C? Есть много ситуаций, в которых С совершенно нормально.
Джорджио
3
@ Джорджио: И все они испаряются через первые шестьдесят секунд, и вам нужно сохранить свой код.
DeadMG
7
I use C++ because is the language I use mostly, know mostly and like mostly.И это ответ на ваш вопрос. Вы должны переключать языки только в середине проекта, когда есть проблема, которую ваш текущий язык не может решить. I don't use templates, operator overloading, polymorphism, inheritance.Изучать и использовать концепции гораздо полезнее, чем переходить на C. Поскольку это хобби-проект, почему бы не использовать несколько вещей, которые вы раньше не использовали? Вы всегда можете запустить другой проект на C и выучить язык, но для вашего текущего проекта переключать не имеет смысла.
Яннис
4
Я не использую 100% языка в каждом проекте, который я пишу. Вы знаете C ++ лучше всего, вы можете найти веские причины для использования функций, которые вы не нашли ранее. Вы можете начать лечение C ++ как гораздо более безопасным С, как только вы начнете использовать стандартный материал библиотеки и бустер конструкты нравится std::shared_ptr, std::unique_ptr, boost::scoped_ptr, std::vector, std::deque, std::mapи т.д. Для функции обратного вызова, вид в использование функторов, и в C ++ 11, вам Можно также начать использовать такие вещи, как лямбда-функции.
WKL
3
@ Джорджио: Да. Прокручивание бесконечного связанного списка неизбежно приведет к ненужным ошибкам.
DeadMG

Ответы:

40

Вы не используете его сейчас, но в следующий раз, когда вы потеряете память или получите двойное удаление, вы будете просить вернуться std::vector<T>, std::unique_ptr<T, Del>и std::shared_ptr<T>, что может решить эти проблемы легко - почти тривиально. Это то, что происходит со всеми, кто использует C над C ++, в конце концов, и самые умные просто не ждут появления ошибок, прежде чем переходить.

Код, который использует newи deleteнепосредственно не принадлежит C ++, он принадлежит к той половине дома, которую мы называем «C с классами». Вот где язык был примерно в 1985 году. Он не особенно похож на C ++, примерно в 2011 году. По всей вероятности, где бы вы ни изучали C ++, он просто не учил этому очень хорошо - что, к сожалению, довольно распространено - и с лучшим образованием, вы бы найти использование этих функций.

В частности, как я перечислил выше, общие структуры данных C ++ и классы управления ресурсами просто существенно превосходят все, что может предложить C. Если вы хотите динамически распределенный массив, используйте std::vector<T>. Это довольно распространенный вариант использования. Если вы их не используете, то ваш код подвергается огромному риску ошибок, особенно связанных с управлением ресурсами. C ++ может гарантировать безопасность и повторно использовать код таким образом, что C никогда не сможет коснуться.

Тем не менее, я думаю, что вы также можете ожидать слишком многого. Написание шаблонов и перегрузок операторов не характерно для пользователей библиотек. Если ваш код использует std::vector<T>, вам не нужно писать шаблон, чтобы это произошло. Если ваш код использует std::string, никто не заставляет вас перегружать операторов. Вам нужно только написать эти вещи std::vector<T>и std::string- но вы все равно можете в полной мере воспользоваться ими.

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

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

DeadMG
источник
1
@Giorgio: make_sharedсуществует, и вы можете написать простой make_uniqueшаблон, который выполняет ту же работу. Это безопаснее.
DeadMG
4
Отличный ответ. Гвоздь на голову. C ++ наиболее ценен для этих маленьких библиотек, которые мы всегда должны использовать.
Андрес Яан Тэк
2
@ Джорджио: Это небезопасно, потому что при вызове нескольких таких аргументов вы можете получить утечку памяти в случае исключения, и make_sharedэто более эффективно. Только заводские функции могут обеспечить гарантированную безопасность исключений.
DeadMG
6
@ tp1: WTF? По английски пожалуйста.
DeadMG
2
@ Lohoris Тебе не нужна цитата для здравого смысла. Каким образом C должен быть более производительным, чем C ++?
Крис говорит восстановить Монику
7

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

Неманья Трифунович
источник
6

Я бы посмотрел на это с другой стороны. Вы получаете что - либо путем переписывания кода в C? Даже в чисто хобби-проекте есть такая стоимость, связанная с переписыванием. Если ничто иное, как я полагаю, будет называться альтернативной стоимостью, т. Е. Другими вещами, которые вы могли бы сделать за это время, если бы не тратили свое время на переписывание этого в C.

Итог: если вы не думаете, что код действительно может быть использован в какой-то среде, где доступ к C ++ действительно ограничен (или отсутствует), в лучшем случае это будет бессмысленная трата времени. По крайней мере, по моему опыту, это очень быстро выходит за рамки этого - вспоминая код, который я написал на C ++, который нужно было преобразовать в C, я могу довольно ясно помнить, что даже во многих случаях это казалось это должно быть тривиально, я использовал гораздо больше функций, специфичных для C ++, чем я изначально предполагал. Чтобы иметь большую надежду на то, что он будет полезен, вам, скорее всего, придется ориентироваться на C89 / 90, и в этом случае вам быстро напомнят о таких вещах, как определение всех переменных в начале блока вместо того, где они на самом деле используемый.

Короче говоря, если вы не уверены, что переписывание на С принесет реальную выгоду, почти неизбежно есть куда более полезные вещи.

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

Как более общий ответ:

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

динамический
источник
1

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

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

hotpaw2
источник
1

Ответить на ваши вопросы нелегко, так как мы не знаем, работаете ли вы над проектом, чтобы улучшить свои языковые навыки (C против C ++) или улучшить другие навыки программирования (дизайн, решение проблем и т. Д.).

«Единственные возможности C ++, которые я использую, - это классы для инкапсуляции данных и методов, но это можно сделать и с помощью структур и функций». Это неправда. structsв C не поддерживают инкапсуляцию и не могут содержать функции (методы) - по крайней мере, без использования методов, таких как указатели на функции. Кроме того, функции в C слабее, потому что они не могут быть перегружены.

«Я использую new и delete, но могу также использовать malloc и free, и я использую наследование только для обратных вызовов, что может быть достигнуто с помощью указателей на функции». Как упоминалось в deadmg, использование напрямую newи deleteв C ++ не рекомендуется. Кроме того, IMHO (и GoF) наследование в ООП следует отдавать предпочтение перед композицией, только когда требуется полиморфизм. И я не думаю, что достичь полиморфизма (позднего связывания) в Си тривиально, используя указатели на функции.

Кроме этого, я не буду пытаться убедить вас, что C ++ "лучше", чем C, потому что это вопрос предпочтений, и он всегда зависит от проблемы, которую вы пытаетесь решить (использование функций ООП для разработки вашего эмулятора NES может быть хорошая идея).

sakisk
источник
1
structsна самом деле C может использоваться для инкапсуляции методов. Вы просто создаете структуру указателей на функции и инициализируете их так, чтобы они указывали на те функции, которые вы хотите. Для примера посмотрите lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 .
Роберт Мартин
Это верно. Спасибо за комментарий, я расширил ответ.
Сакиск
Ницца. Еще одна нит: функции в C могут быть перегружены (подумайте printf), но при этом вы потеряете любую проверку типов. Невозможно иметь конечный набор приемлемых объявлений: это либо 1 (и вы получаете проверку типов), либо «многие» (и потеря всей проверки типов на большой личный риск). Как и большинство вещей в C, это возможно, но часто неудобно.
Роберт Мартин
Указатели на функции являются продвинутой техникой C? В самом деле?
Donal Fellows
@DonalFellows Вы правы, я утрировал. Удален расширенный ... :)
sakisk
0

Я очень новичок, так что вот мои 2 бита.

Я изучаю C и C ++ на Wibit.net с некоторыми хорошими базовыми видеоуроками, может быть, они могут вам очень помочь в обзоре ситуации (не в рекламе!)

Я советую вам перейти на C, просто чтобы узнать, как вы любитель, это будет удовольствие, а не проблема.

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

H_7
источник
1
Большое спасибо, но я не учусь, я уже знаю C и C ++, я спрашиваю, какой использовать для этого конкретного проекта.
Петруза
Ой, мое время учиться! = P
H_7
1
Кроме того, я бы посоветовал, чтобы вместо видеоуроков вы получили книги Кернигана и Страуструпа, отличную среду разработки (Visual Studio, Eclipse, Xcode) и научились кодировать примеры, проб и ошибок и прибегать к переполнению стека.
Петруза
-1

Вот плюсы и минусы C ++ против C:

  1. Переход на C облегчит пребывание в выбранном подмножестве C ++, потому что компилятор выдаст ошибку, когда вы выйдете за его пределы. Если основная проблема заключается в нахождении в определенном подмножестве, следует выбрать эту альтернативу. (почему у нас нет поддержки компилятора для этого?)
  2. После того, как вы сможете остаться в выбранном подмножестве функций c ++, затем следует попытаться изменить подмножество, чтобы избавиться от плохих соглашений, нарушающих код. Это требует использования всего с ++.
  3. Если у вас есть и «оставаться внутри подмножества», и «это хорошее подмножество», тогда выходите за пределы возможностей c ++ и начинайте думать о требованиях.
ТР1
источник