Ниже приведены преимущества C ++.
- C ++ предоставляет конкретные функции, о которых они спрашивают
- Их компилятор C почти наверняка действительно является компилятором C ++, поэтому нет никаких финансовых последствий для программного обеспечения.
- C ++ такой же переносимый, как и C
- Код C ++ может быть таким же эффективным, как C (или более, или менее)
Есть ли какие-то конкретные причины и конкретные сценарии, когда нужно использовать C вместо C ++?
Ссылка на этот вопрос: Библиотека дженериков на C
Не дубликат, потому что этот вопрос касается языковых ограничений, а не о том, следует / не следует изучать один язык вместо другого.
Сообщение Питера Киркхэма было для меня наиболее информативным, особенно в отношении вопросов C99, которые я не рассматривал, поэтому я его принял. Спасибо всем, кто принимал участие.
Ответы:
C - законченный язык программирования. C не является произвольным подмножеством C ++. C вообще не является подмножеством C ++.
Это действительно C:
Чтобы он компилировался как C ++, вам нужно написать:
который больше не действителен C. (вы можете использовать приведение в стиле C, в этом случае он будет компилироваться на C, но его избегают большинство стандартов кодирования C ++, а также многие программисты на C; обратите внимание на комментарии «не приводить malloc» во всем стеке) ,
Это не один и тот же язык, и если у вас есть проект на C, вы не хотите переписывать его на другом языке только для того, чтобы использовать библиотеку. Вы бы предпочли использовать библиотеки, с которыми вы можете взаимодействовать на языке, на котором вы работаете. (В некоторых случаях это возможно с помощью нескольких
extern "C"
функций-оболочек, в зависимости от того, как шаблон / встроена библиотека C ++.)Принимая первый файл C в проекте я работаю, это то , что произойдет , если вы просто своп
gcc std=c99
дляg++
:Всего 69 строк ошибок, четыре из которых являются недопустимыми преобразованиями, но в основном для функций, которые существуют в C99, но не в C ++.
Не то чтобы я использовал эти функции для развлечения. Перенос его на другой язык потребует значительных усилий.
Поэтому совершенно неправильно предполагать, что
Портирование существующего кода C на процедурное подмножество C ++ часто сопряжено со значительными затратами.
Поэтому предлагать «использовать класс C ++ std :: queue» в качестве ответа на вопрос, ищущий библиотечную реализацию очереди на C, является более низким, чем предлагать «использовать объект C» и «вызвать класс Java java.util.Queue с помощью JNI». или «вызвать библиотеку CPython» - Objective C на самом деле является правильным надмножеством C (включая C99), а библиотеки Java и CPython можно вызывать непосредственно из C без необходимости переносить несвязанный код на язык C ++.
Конечно, вы можете добавить фасад C к библиотеке C ++, но как только вы это сделаете, C ++ ничем не отличается от Java или Python.
источник
Я понимаю, что это не профессиональный и не особо хороший ответ, но для меня это просто потому, что мне очень нравится C. C небольшой и простой, и я могу вместить весь язык в моем мозгу, C ++ для меня всегда казался огромным беспорядком со всевозможными слоями мне тяжело грокнуть. Из-за этого я обнаружил, что всякий раз, когда я пишу на C ++, я трачу гораздо больше времени на отладку и ударяюсь головой о твердые поверхности, чем когда кодирую C. Я снова понимаю, что во многом это результат моего собственного «незнания».
Если мне удастся выбрать, я напишу все высокоуровневые вещи, такие как интерфейс и взаимодействие с базой данных на python (или, возможно, C #), и все вещи, которые должны быть быстрыми на C. Для меня это дает мне лучшее из всех миров. Написание всего на C ++ похоже на худшее из миров.
Изменить: я хотел бы добавить, что я думаю, что C с несколькими функциями C ++ в значительной степени плохая идея, если вы собираетесь работать с несколькими людьми над проектом или если ремонтопригодность является приоритетом. Возникнут разногласия относительно того, что составляет «несколько», и какие биты должны быть выполнены в C, а какие в C ++, что в конечном итоге приведет к очень шизофренической кодовой базе.
источник
C ++ просто не поддерживается в некоторых реальных средах, таких как низкоуровневые встроенные системы. И для этого есть веская причина: язык C достаточно хорош для таких вещей, так зачем использовать что-то большее?
источник
Ненавижу программирование на C ++.
источник
Может быть несколько причин:
Я по-прежнему предпочитаю писать на C ++, когда мне это сойдет с рук, и в целом я думаю, что преимущества перевешивают недостатки. Но я также вижу аргумент в пользу использования C в некоторых случаях.
источник
Есть масса аргументов о встроенном программировании, производительности и прочем, я на них не верю. C ++ легко сравнивается с C в этих областях. Тем не мение:
Совсем недавно, после 15 лет программирования на C ++, я заново открыл для себя свои корни C. Я должен сказать, что, хотя в C ++ есть хорошие функции, облегчающие жизнь, есть также множество подводных камней и своего рода «всегда есть лучший способ». На самом деле вы никогда не будете довольны принятым решением. (Не поймите меня неправильно, это могло бы быть хорошо, но в основном нет).
C ++ дает вам бесконечную стрельбу. Что, возможно, было бы хорошо, но почему-то вы всегда используете слишком много этого. Это означает, что вы маскируете свои решения «красивыми» и «красивыми» слоями абстракций, общности и т. Д.
Вернувшись к C, я обнаружил, что это снова было действительно увлекательное программирование. Потратив так много времени на моделирование и размышления о том, как наилучшим образом использовать наследование, я обнаружил, что программирование на C фактически делает мой исходный код меньше и более читабельным. Это, конечно, зависит от вашего уровня самодисциплины. Но очень легко добавить слишком много абстракций в простой код, который на самом деле никогда не нужен.
источник
infinite gunfire
, о да, так верно. Наши ноги буквально дрожат :)У C есть главное преимущество в том, что вы можете просто увидеть, что происходит на самом деле, когда вы смотрите на какой-то фрагмент кода (да, препроцессор: скомпилируйте с -E, а затем вы это увидите). То, что слишком часто не соответствует действительности, если вы посмотрите на код C ++. Там у вас есть конструкторы и деструкторы, которые вызываются неявно на основе области видимости или из-за присваиваний, у вас есть перегрузка оператора, которая может иметь удивительное поведение, даже если оно не используется неправильно. Признаюсь, я помешан на контроле, но пришел к выводу, что это не такая уж плохая привычка для разработчика программного обеспечения, который хочет писать надежное программное обеспечение. Я просто хочу иметь шанс сказать, что мое программное обеспечение делает именно то, что должно делать, и в то же время не вызывает неприятных ощущений в животе, потому что я знаю, что в нем все еще может быть так много ошибок, что я бы не стал ''
В C ++ также есть шаблоны. Я ненавижу и люблю их, но если кто-то говорит, что полностью понимает их, я называю его / ее лжецом! Это включает в себя составителей компилятора, а также людей, участвующих в определении стандарта (что становится очевидным, когда вы пытаетесь его прочитать). Существует так много абсурдно вводящих в заблуждение угловых случаев, что просто невозможно рассмотреть их все, пока вы пишете реальный код. Мне нравятся шаблоны C ++ за их мощь. Действительно удивительно, что вы можете с ними сделать, но они также могут привести к самым странным и трудным для поиска ошибкам, которые только можно (не) вообразить. И эти ошибки действительно случаются и даже не редко. Чтение о правилах, используемых для разрешения шаблонов в C ++ ARM, чуть не взорвало мою голову. И это вызывает у меня неприятное чувство потраченного впустую времени на чтение сообщений об ошибках компилятора длиной в несколько 1000 символов, для которых мне нужно уже 10 минут или больше, чтобы понять, что компилятор действительно хочет от меня. В типичном коде C ++ (библиотеки) вы также часто находите много кода в файлах заголовков, чтобы сделать определенные шаблоны возможными, что, в свою очередь, делает циклы компиляции / выполнения мучительно медленными даже на быстрых машинах и требует перекомпиляции больших частей кода, когда вы что-то меняете. там.
В C ++ также есть ловушка const. Вы либо избегаете const для всех случаев, кроме самых тривиальных, либо рано или поздно вам придется отбросить его, либо рефакторинг больших частей кодовой базы, когда она будет развиваться, особенно когда вы собираетесь разработать красивый и гибкий объектно-ориентированный дизайн.
В C ++ более строгая типизация, чем в C, и это здорово, но иногда мне кажется, что я кормлю тамагочи, когда пытаюсь скомпилировать код C ++. Большая часть предупреждений и ошибок, которые я обычно получаю от этого, на самом деле связаны не с тем, что я делаю что-то, что не сработает, а просто с вещами, которые компилятор не хочет, чтобы я делал так или нет без преобразования или добавления здесь дополнительных ключевых слов и там.
Это лишь некоторые из причин, по которым мне не нравится C ++ для программного обеспечения, которое я пишу самостоятельно, только с использованием некоторых предположительно надежных внешних библиотек. Настоящий ужас начинается, когда вы пишете код в команде с другими людьми. Практически не имеет значения, являются ли они очень умными хакерами C ++ или наивными новичками. Ошибки совершают все, но в C ++ их намеренно трудно найти, а еще труднее обнаружить до того, как они произойдут.
С C ++ вы просто теряетесь, не используя отладчик все время, но мне нравится иметь возможность проверять правильность моего кода в моей голове и не полагаться на отладчик, чтобы найти мой код, работающий по путям, которые я никогда не ожидал. На самом деле я пытаюсь запустить весь свой код в голове и попытаться взять все его ветки, даже в подпрограммах и т. Д., И использовать отладчик только изредка, просто чтобы посмотреть, насколько хорошо он проходит через все уютные места, которые я для него приготовил. Написание и выполнение такого количества тестовых примеров, что все пути кода использовались во всех комбинациях со всевозможными странными входными данными, просто невозможно. Таким образом, вы можете не знать об ошибках в программах на C ++, но это не значит, что их там нет. Чем крупнее становится проект C ++, тем меньше становится моя уверенность в том, что в нем не будет большого количества необнаруженных ошибок, даже если он отлично работает со всеми имеющимися у нас тестовыми данными. В конце концов, я выбрасываю его и начинаю заново с другого языка или комбинации других языков.
Я мог бы продолжить, но, полагаю, к настоящему времени я ясно изложил свою точку зрения. Все это заставило меня чувствовать себя непродуктивным, когда я программирую на C ++, и заставило меня потерять уверенность в правильности моего собственного кода, что означает, что я больше не буду его использовать, хотя я все еще использую и полагаюсь на код C, который я написал более 20 много лет назад. Может быть, это просто потому, что я не очень хороший программист на C ++, или, может быть, хорошее знание C и других языков позволяет мне понять, какой я ламер на самом деле, когда дело касается C ++, и что я никогда не смогу полностью это понять. ,
Жизнь коротка...
источник
В низкоуровневой встраиваемой среде некоторые из «инженеров-программистов» будут иметь опыт работы с EE и едва освоить C. C ++ более сложен, и некоторые из этих ребят просто боятся изучать новый язык. Таким образом, C используется как наименьший общий знаменатель. (Прежде чем вы предложите избавиться от этих парней, они по крайней мере так же важны, как и специалисты по CS, которые не понимают хардкорных аналоговых вещей.)
Исходя из опыта унаследованных и поддерживаемых обоих: ужасный дизайн на C трудно понять, развеять и преобразовать во что-то полезное.
Ужасный дизайн в C ++ бесконечно хуже, так как случайные слои абстракции заставляют ваш мозг блуждать по кодовой базе, пытаясь выяснить, какой код будет выполняться в каких обстоятельствах.
Если мне придется работать с инженерами, которые, как я знаю, не будут создавать отличных проектов, я бы предпочел первое, чем второе.
источник
Я не вижу причин, кроме личной неприязни, даже к программированию встроенных систем и тому подобному. В C ++ накладные расходы оплачиваются только за те функции, которые вы используете. Подмножество C из C ++ можно использовать в некоторых конкретных ситуациях, когда накладные расходы C ++ для вас слишком велики. При этом я думаю, что некоторые программисты на C переоценивают накладные расходы на некоторые конструкции C ++. Приведу несколько примеров:
Одна из веских причин может заключаться в том, что вы программируете для платформы, которая не имеет достойного компилятора C ++ (компилятора C ++ нет вообще, или компилятор существует, но плохо реализован и создает ненужные высокие накладные расходы для некоторых функций C ++).
источник
Зачем ограничивать разговоры на английском? Возможно, вы были бы более креативным автором на сербском языке.
Это тот же аргумент, но с очевидными заблуждениями. Если у вас есть задача, и ваши удобные инструменты решают ее эффективно, вы, вероятно, воспользуетесь удобными инструментами не зря.
источник
C ++ требует гораздо более длительного обучения. В C есть всего несколько конструкций, о которых вам нужно знать, и тогда вы можете начать писать мощное программное обеспечение. В C ++ вам нужно изучить базу C, затем объектно-ориентированное и универсальное программирование, исключения и т. Д. И через некоторое время вы можете узнать большинство функций, и вы, возможно, сможете их использовать, но вы все еще не знаете, как компилятор будет переведите их, какие неявные накладные расходы у них есть или нет. На это уходит много времени и сил.
Для профессионального проекта этот аргумент может не считаться, потому что вы можете нанять людей, которые уже очень хорошо знают C ++. Но в проектах с открытым исходным кодом, где C по-прежнему широко используется, люди выбирают язык, который им нравится, и они могут использовать. Учтите, что не каждый программист ОС является профессиональным программистом.
источник
Я хотел бы продолжить ответ Дэна Олсона. Я считаю, что люди опасаются потенциально опасных и контрпродуктивных возможностей C ++, и это вполне оправданно. Но в отличие от того, что говорит Дэн, я не думаю, что простой выбор стандарта кодирования эффективен по двум причинам:
Я думаю, что вторая причина здесь гораздо более важна, чем первая, потому что выбор стандарта кодирования может легко стать политическим вопросом и впоследствии может быть пересмотрен. Рассмотрим следующий упрощенный случай:
(Альтернатива, когда стандарт не пересматривается на шаге 3, эмпирически слишком маловероятна для рассмотрения и в любом случае не будет намного лучше.)
Хотя несколько лет назад я использовал C ++ практически для всего, я начинаю твердо чувствовать, что C предпочтительнее в низкоуровневых задачах, которые должны выполняться либо C, либо C ++, а все остальное следует делать в каком-то другом язык целиком. (Возможными исключениями являются только некоторые конкретные высокопроизводительные проблемные области, по отношению к Blitz ++ )
источник
Я использую C или, по крайней мере, экспортирую интерфейс C, когда пишу код библиотеки.
Я не хочу, чтобы сбои с ABI были неопределенными.
источник
Я никогда не видел аргументов в пользу использования C вместо C ++, которые я считал бы убедительными. Я думаю, что большинство людей опасаются определенных функций, которые предлагает C ++, и зачастую вполне оправданно. Тем не менее, это меня не убеждает, потому что можно указать, использовать ли определенные функции или нет, с помощью стандартов кодирования. Даже в C есть многого, чего бы вам хотелось избежать. Полный отказ от C ++, по сути, означает, что он не дает ощутимых преимуществ перед C, которые помогли бы писать лучший код, что я считаю совершенно невежественным.
Вдобавок люди, кажется, всегда поднимают вопрос о платформах, на которых не существует компилятора C ++. Конечно, C здесь подойдет, но я думаю, вам будет трудно найти такую платформу в наши дни.
источник
Один вопрос, который я еще не поднимал, я считаю самым важным:
Большинство библиотек, которые я использую ежедневно, - это библиотеки C с привязками для Python, Ruby, Perl, Java и т. Д. Из того, что я видел, намного проще обернуть библиотеки C 19 различными языковыми привязками, чем для обернуть библиотеки C ++.
Например, я выучил Каир однажды и с тех пор использовал его на 3 или 4 разных языках. Большая победа! Я бы предпочел написать программу, которую можно было бы снова использовать в будущем, и написание программы, которую можно было бы легко адаптировать к другим языкам программирования, является крайним случаем.
Я знаю, что можно связывать библиотеки C ++, но, AFAICT, это не то же самое. Я использовал Qt (v3 и v4) на других языках, и это далеко не так приятно использовать: им кажется, что писать C ++ на каком-то другом языке, а не на нативных библиотеках. (Вы должны передавать сигнатуры методов C ++ в виде строк!)
C ++, вероятно, лучший язык, если вы пишете функцию, которая будет использоваться один раз, или если вы думаете, что весь мир - это C ++. C кажется более легким языком, если вы проектируете с учетом языковой переносимости с самого начала.
источник
Разработка ядра Windows не поддерживает C ++ (к сожалению).
источник
Вы можете прочитать занимательную тираду о том, почему Линус Торвальдс предпочитает C здесь
источник
Собственный код на Mac является объективным-c. Собственный код на ПК - это c (window.h) или c ++ (mfc). Обе эти среды позволят вам использовать c с небольшими изменениями или без них. Когда я хочу, чтобы библиотека кода была кроссплатформенной, мне кажется, что это хороший выбор.
источник
Я могу придумать несколько причин.
Не может быть удовлетворительного компилятора C ++. C ++ - намного более крупный язык, и я запускал компиляторы C в системах, которые не могут обрабатывать современный C ++.
Спрашивающий или люди, с которыми он работает, могут быть знакомы с C, но не с C ++.
Проект может быть на C. Хотя в C можно добавить некоторые функции C ++, это может легко привести к неустранимой неразберихе. Я бы посоветовал выбрать один или другой язык (обычно C ++, когда это возможно).
У спрашивающего может быть устаревшее представление о кривой обучения C ++. (При правильном подходе это легче, чем C. Большинство вводных книг, которые я видел, не подходят к этому правильно.)
Помните, что C и C ++ - это два разных языка, и со временем они становятся все более разными. Кодировать оба сразу - плохая идея, а использование C-подобного подмножества C ++ упускает большинство преимуществ C ++.
источник
Если вы работаете в среде с двумя языками, вы можете использовать C для некоторых критически важных для производительности низкоуровневых функций и более функциональный / высокоуровневый язык, такой как C # / Java, для бизнес-логики. Если для этих функций используется код C ++, для JNI / неуправляемого кода требуются C-Wrappers, и это усложняет задачу, чем использование только C.
источник
Я использую C ++ с программированием на C по двум причинам:
vector
иstring
избавиться от управления памятью массиваТак что C действительно заимствует немного C ++, но использует компилятор C ++ по мере возможности. Как говорит кто-то другой в ответах, я обнаружил, что теперь я на самом деле набираю больше C ++ таким образом, и там, где C будет слишком вовлечен, я использую C ++. Монитор / блокировка с использованием RAII - одна из тех, которые я недавно использовал при работе с многопоточными программами, и другую аналогичную конструкцию для открытия / закрытия файлов.
источник
Я думаю, что C более портативен. Около 5 лет назад я работал над переносом кода на многие разновидности unix (AIX, Irix, HPUX, Linux). Код C было легко перенести, но у нас были различные проблемы с переносом части кода C ++. Возможно, это была просто незрелая среда разработки, но по этой причине я бы предпочел использовать C вместо C ++ ...
источник
C - простой язык, C ++ - нет. Для многих людей C ++ слишком сложен для полного освоения, см. Http://en.wikipedia.org/wiki/C%2B%2B#Criticism .
Из-за сложности разные программисты обычно владеют только разными подмножествами языка. Это делает чтение чужого кода болезненным.
Сложность и недостатки языка слишком сильно отвлекают, а иногда снижают продуктивность. Вместо того чтобы сосредоточиться на самой работе, я часто боролся с самим языком. Java / python - более производительные альтернативы.
Отладка поврежденного кода C обычно намного проще, чем отладка неисправного кода C ++.
В отличие от Java / C #, стандартная библиотека C ++ мало что выходит за рамки стандартной библиотеки C.
Некоторые известные программисты, такие как Линус Торвальдс (Linux) и Ричард Столлман (Emacs), не любят C ++.
источник
Большинство программистов считают само собой разумеющимся, что все считают качество своим приоритетом. Это не всегда так. Если вы привыкли к C, может показаться, что C ++ слишком много делает для вас за кулисами. Строгость проверки типов в C ++ также может показаться сдерживающей. Многие люди готовы рискнуть внести те виды ошибок, которые C ++ может помочь предотвратить, чтобы избежать этих «неприятностей».
источник
Я могу придумать три причины. Во-первых, C больше подходит для встроенных систем из-за небольшого размера его двоичных файлов и более широкой доступности компиляторов C в любой системе. Вторая - это переносимость: C - это меньший по размеру язык, и код ANSI C компилируется где угодно. На C ++ легче нарушить переносимость. Последнее - это сам язык. C ++ сложнее и определенно является очень плохо разработанным языком. Грипсы Торвальдса описаны выше. Вы также можете посмотреть ответы на часто задаваемые вопросы C ++ ( http://yosefk.com/c++fqa/ ).
источник
Может возникнуть проблема с переносимостью. В отличие от ответа Гордона Карпентера-Томпа, я бы предположил, что это скорее поддержка времени выполнения разных версий libstdc ++ в разных версиях linux / unix. См. Эту ссылку для хорошего обсуждения этого. Небольшой отрывок:
источник
Здесь я могу следовать многим предложениям в обоих направлениях. Но в конечном итоге все сводится к а) сопоставимому простому б) сопоставимому сложному.
Я понятия не имею, «изобрел» ли кто-то своего рода измеритель сложности языка.
По шкале от 0 до 10 я бы, вероятно, поставил C на 2 или 3, тогда как C ++ был бы между 8-10. Я бы сказал, что C ++ - один из самых сложных языков, но я не знаю, например, Ada, PL1 и т.п., так что, возможно, это не так сложно по сравнению с каким-либо другим языком.
C ++ наследует всю сложность C, поэтому он не может быть ниже уровня сложности C.
Мне, со своей стороны, было бы намного удобнее использовать какой-нибудь язык сценариев и C. Итак, в конце концов, нужно ответить на следующий вопрос. "Всегда лучше?"
источник
Самое полезное, что я нашел в C, - это отсутствие пространств имен и перегрузок: имена функций и символов являются уникальными идентификаторами. Чтобы найти места, где используются эти символы, вы можете просто
grep
просмотреть файлы исходного кода, и результаты поиска покажут места.Это важно при подключении новой функции или компонента к старой и запутанной системе.
Вы не можете сделать это легко в C ++ без сложного инструмента построения графа вызовов.
источник
Большинство людей думают, что C и C ++ каким-то образом связаны, но они, к сожалению, ошибаются. C ++ - это совершенно другой язык, чем C.
В C ++ вы мыслите категориями объектов и их взаимосвязей. В C вы мыслите терминами API. Это как разница между днем и 17.
Плохая аналогия: если кто-то добавляет китайский язык к английскому и называет его английским ++, вам, вероятно, будет неудобно добавлять китайскую строчку в свое последнее любовное письмо, потому что в этой части английского ++ намного проще выразить любовь.
источник
Ниже приведены все причины, по которым может быть полезно ограничить проект C:
источник