Зачем кому-то использовать C вместо C ++? [закрыто]

132

Хотя люди, кажется, любят жаловаться на C ++, я не смог найти много доказательств того, почему вы хотели бы выбрать C вместо C ++. Кажется, что у C не так много неприятностей, и если у C ++ есть все эти проблемы, почему вы не можете просто ограничиться подмножеством C? Какие у вас мысли / опыт?

Simucal
источник
точная дублирующая ссылка больше не работает ..... говорит парень, который опоздал на вечеринку :)
kyle
4
C действительно лучше и проще C ++, но любой программист на C может преобразовать C ++ в C и посмеяться.
BobRun
11
Пугает то, что люди в целом думают, что "++" означает, что это действительно хорошо, извините, это не так.
BobRun
Помимо очевидного - небольших / встроенных устройств - как правило, C лучше подходит для решения чисто числовых задач (например, графическая обработка графического процессора, массовые параллельные вычисления физики, анализ шаблонов и т. Д.), Где возможности ООП являются раздутыми. C ++ лучше подходит для моделирования систем, где «вещи» взаимодействуют, гораздо проще с возможностями ООП.
Paceman
3
Потому что JavaScript, передовой опыт, c ++ и ООП - это глупо / слишком занято, пытаясь решить эти абстрактные проблемы, которые, вероятно, на самом деле не существуют или нуждаются в решении когда-либо.
marshal craft

Ответы:

132

Ответ Джоэла хорош по причинам, по которым вам, возможно, придется использовать C, хотя есть несколько других:

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

В некоторых случаях, однако, вы могли бы хотеть использовать C вместо C ++:

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

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

В любом случае, если вы это делаете, вы используете C. Действительно ли ваш вопрос: «Почему программисты на C не используют компиляторы C ++?» Если это так, то вы либо не понимаете языковых различий, либо не понимаете теорию компилятора.

Адам Дэвис
источник
2
Также существует стандарт MISRA C, который, по мнению AFAIK, еще не совсем стабилен для C ++.
Пол Натан,
60
Часть производительности не обязательно верна. Существует множество областей, в которых C ++ может оптимизировать намного лучше, чем C. (Конечно, иногда бывает и обратное, но в целом выбор C вместо C ++ по соображениям производительности - плохая идея).
jalf
9
Мне было бы интересно узнать больше о производительности. Я не понимаю, почему C работает лучше «изредка». Для среднего программиста может оказаться, что C ++ упрощает достижение производительности (хорошее использование шаблонов), но программа на C, написанная экспертом, должна быть быстрее - меньше накладных расходов.
Адам Дэвис,
3
Конечно, для написания и отладки более быстрой программы на C потребуется больше времени, поэтому есть компромисс, и, учитывая скорость машин, компромисс редко окупается, за исключением специализированных приложений, поэтому C ++ в целом лучше. (к тому времени, когда код будет готов, компьютеры станут быстрее и съедят разницу)
Адам Дэвис,
21
@Adam: C ++ работает лучше, чем C с "красивым" кодом. C ++ может использовать шаблоны и встроенные функции там, где C требуется макрос. Накладные расходы C ++ появляются только при запросе, в остальном это то же самое, что и C. (virtual, try / throw, dynamic_cast). Большая часть накладных расходов отображается только в размере изображения программы.
Zan Lynx
88

Мне нравится минимализм и простота.

plan9assembler
источник
9
Хорошо - достаточно честно ... так почему не Форт?
Джонатан Леффлер
14
Думаю, ему также нравятся библиотеки, книги, форумы?
gnud 04
30
мне нравится минимализм и простота вашего ответа ... :)
Joe DF
8
Согласен. C очень простой и «маленький». C всегда выглядит одинаково, и если вы новый участник проекта, легко понять, как это работает. В c ++ есть много бесполезных вещей, и, глядя на проект c ++, я сразу же запутываюсь. Я могу понять людей c ++ (язык C с возможностями объектно-ориентированного программирования), но C просто проще и проще.
user69969
1
Также я думаю, что C намного лучше подходит для написания каких-то библиотек, таких как небольшие универсальные библиотеки, языки сценариев и, да, механизмы рендеринга.
keebus
65
  • Потому что они уже знают C
  • Потому что они создают встроенное приложение для платформы, на которой есть только компилятор C.
  • Потому что они поддерживают устаревшее программное обеспечение, написанное на C
  • Вы пишете что-то на уровне операционной системы, движка реляционной базы данных или движка розничной 3D-видеоигры.
оборота Джоэл Кохорн
источник
4
Некоторые микроконтроллеры имеют только компиляторы C, что действительно отстой. Основные функции C ++ (пространства имен, классы помимо виртуальных функций, перечисления, объявление переменных где-либо еще, кроме верхней части блока) являются наиболее ценными, IMHO.
Jason S
2
Из этого следует, что вы выбрали бы C только в том случае, если нет разумных альтернатив.
2
@ Джо: помимо первого пункта, это подводит итог. Многие более поздние языки взяли C и сказали: «Эй, мы можем сделать лучше» .
Джоэл Коэхорн
1
Согласовано. Если вы не используете сложные функции C ++, я считаю, что C ++ монотонно лучше C. С более сложными функциями C ++ все становится более спорным, но тогда споры обычно ведутся против более высокого уровня абстракции, например Java.
Пол Натан
4
Фактически, большинство движков 3D-игр используют C ++. UE4 в основном использует C ++.
Адитья Каши
56

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

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

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

Самая большая практическая причина предпочтения C заключается в том, что поддержка более распространена, чем C ++. Есть много платформ, особенно встроенных, на которых даже нет компиляторов C ++.

Также существует вопрос совместимости для поставщиков. В то время как C имеет стабильный и четко определенный ABI (двоичный интерфейс приложения), C ++ его не имеет. ABI в C ++ более сложен из-за таких вещей, как vtables и конструкторы / деструкторы, поэтому он реализуется по-разному для каждого поставщика и даже версий набора инструментов поставщиков.

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

Эндрю Грант
источник
7
«Интерпретируемый Python во многих отношениях считается« медленным »языком, но для нетривиальных задач опытный программист Python может легко создать код, который выполняется быстрее, чем код неопытного разработчика C». Я полагаю, что программист (не обязательно программист на Python), который брал уроки алгоритмов, может создать код, который выполняется быстрее, чем код неопытного разработчика (в целом).
Андрей Чобану
15
И тот же неопытный разработчик c создаст код Python, который будет медленнее, чем его код c. Python намного медленнее, чем c.
Милли Смит
37

Я предпочитаю писать на C, потому что мне нравится работать с небольшим, трудным языком. Мне нравится иметь доступ к стандарту, который можно прочитать за разумное время (для меня - я очень медленный читатель). Более того, я использую его для написания программного обеспечения для встраиваемых систем, для которых существует несколько желательных компиляторов C ++ (например, некоторые микроконтроллеры PIC).

скоро
источник
re: PICs - Я чувствую твою боль. Если мне когда-нибудь придется писать много кода PIC, я, вероятно, буду использовать компилятор IAR, который поддерживает C ++. Я использовал его на MSP430, и он довольно хорош.
Jason S,
1
И не забывайте о значительно улучшенном времени компиляции для C. Без системы шаблонов.
Инженер
35

Я придерживаюсь другой точки зрения: зачем использовать C ++ вместо C?

Книга «Язык программирования C» (также известная как K&R) ясно расскажет вам, как делать все, что может делать язык, на менее чем 300 страницах. Это шедевр минимализма. Ни одна книга по C ++ не может сравниться с этим.

Очевидный контраргумент заключается в том, что то же самое можно сказать о большинстве, если не обо всех, современных языках - они также не могут сказать вам, как сделать все, всего на нескольких сотнях страниц. Правда. Так зачем использовать C ++ вместо этого? Богатство возможностей? Мощность? Если вам нужно что-то более многофункциональное или мощное, используйте C #, Objective C, Java или что-то еще в этом роде. Зачем обременять себя сложностями C ++? Если вам нужна степень контроля, предоставляемая C ++, я предлагаю использовать C. C может делать все, и может делать это хорошо.

Дина
источник
Я согласен. Мне нужна сила, поэтому я использую что-то действительно мощное, а не 1/2 точки.
Дина
7
@Dinah: точка 1/2 дает вам более высокий уровень выражений без затрат на производительность и память, как на C # или Java.
Zan Lynx
5
@Zan Lynx: ты прав. Но я надеюсь, что, заняв противоположную позицию, которую я сделал в своем первоначальном посте, я подчеркнул жизнеспособность C над C ++ ... даже если это, как вы указываете, не открытое и закрытое дело.
Дина,
28

В дополнение к нескольким другим уже упомянутым моментам:

Меньше сюрпризов

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

Во многих случаях эта магия хороша, но, например, в системах реального времени она действительно может испортить вам жизнь.

jdisk
источник
27

Ответ Линуса на ваш вопрос: «Потому что C ++ - ужасный язык».

Его свидетельства в лучшем случае анекдотичны, но он прав ..

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

Добавление ссылок:

Почему C ++ для встраиваемых систем

Почему вы все еще используете C? PDF

Я бы погуглил за это .. потому что в сети уже есть много комментариев

Ric Tokyo
источник
17
Я много писал на C, затем короткое время - на C ++, затем очень долго - на VB, а теперь я использую C # последние несколько лет. С тех пор я написал немного кода на C и C ++ и понял, что C четко определен и ограничен, C # крутой и мощный, а C ++ - отстой.
CMPalmer
25
Линус не совсем квалифицирован, чтобы говорить о достоинствах C ++. Цитировать его, как будто он был каким-то оракулом, просто глупо. И фраза о том, что «делать вещи жестким путем» не имеет смысла. Есть веские причины использовать C, но «это больше работа» или «так сказал Линус» не входят в их число.
jalf
8
@jalf, не цитируя Линуса, как если бы он был своего рода оракулом, полезно упомянуть мнение опытного программиста о его выборе в одной из наиболее часто используемых программ в мире: ядре Linux. Вопрос спрашивает мнения (почему кто-то выбрал C) - это то, на что я стремился ответить.
Ric Tokyo,
6
Линус - плохой источник мнений о C ++, потому что он его не использует и, насколько мне известно, пробовал только один раз в 1990 году.
Zan Lynx
3
@Zan Linus продемонстрировал больше самоконтроля в другом месте: «Мы хотели бы использовать C ++ и дополнительные функции, которые он предоставляет, но труднее увидеть, где плохой код в C ++, чем в C». Цитата в моем ответе - это запись мнения, а не «следовать за лидером».
Ric Tokyo
26

Потому что они пишут плагин, а в C ++ нет стандартного ABI.

Мишель
источник
9
Хотя это правда, это не убедительная причина придерживаться C, потому что вы можете экспортировать необходимые функции, используя связь C, и при этом сохранить свою реализацию на C ++.
codelogic
2
@codelogic - проекты C ++ обычно экспортируют намного больше типов и функций, чем эквивалентные проекты C. Это можно скрыть в финальной общей библиотеке, но, возможно, это больше усилий, чем того стоит.
Tom
tbh не очень хороший ответ, но +1, потому что C ++ не имеет стандартного ABI (да .. C ++ - отстой)
hasen
6
C также не имеет стандартного ABI.
Стивен Кэнон
25

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

Фрэнк
источник
Почему это было отклонено? Я сам много работаю на C ++, и я бы не стал возвращаться к C, но у него действительно может быть мучительно долгое время компиляции (подумайте, например, о шаблонах).
Фрэнк
6
Я использую C ++ для реальной работы, но я всегда создаю прототипы на C из-за почти мгновенного времени компиляции.
Tom
Хм, когда все сделано правильно, то есть без раздутых, мы-может-понадобится-эти- # include и not-sure-which-is-the-right-include-so-i-will-include-them-all- # включает время компиляции аккуратно. Когда я взламываю один или три файла, мне требуется всего 1-2 секунды, чтобы скомпилировать 100 моих проектов KLOC.
Себастьян Мах
4
@Tom: Интересно, как выглядит ваша настоящая работа над C ++, если вы можете создавать прототипы на C. Вы не используете возможности C ++? Можете ли вы уточнить?
Себастьян Мах
24

Я привык использовать C ++ в своих проектах. Затем я получил работу, где используется простой C (развивающаяся 20-летняя кодовая база программного обеспечения AV с плохой документацией ...).

В C мне нравятся 3 вещи:

  • Ничего не подразумевается: вы видите, что именно делает ваша программа, а что нет. Это упрощает отладку.

  • Отсутствие пространств имен и перегрузок может быть преимуществом: если вы хотите знать, где вызывается определенная функция, просто выполните grep через каталог с исходным кодом, и он сообщит вам. Никаких других специальных инструментов не требуется.

  • Я заново открыл силу указателей на функции. В основном они позволяют вам делать все полиморфные вещи, которые вы делаете на C ++, но они еще более гибкие.

Calmarius
источник
8
+1 Однако такой полиморфизм в C обычно получается через void *, что опасно, так как отключает любую возможность компилятора проверять, делаете ли вы что-то неприятное.
gd1
4
@ gd1 На практике я не могу припомнить ни одного случая, когда это void*вызвало бы неприятности. Существует множество методов защитного программирования для защиты от ошибок: размещение утверждений повсюду, добавление магических чисел в ваши структуры (в отладочных сборках) и т. Д. Но в настоящее время у нас есть valgrind, dr. память, и даже MSVC инструментирует код для обнаружения проблем, поэтому проблемы с повреждением памяти довольно легко решить.
Calmarius
4
Я почти никогда не сталкиваюсь с повреждением памяти в своих программах, но, если возможно, я бы предпочел обнаруживать ошибки до запуска программы. Приведение void*в whatever*соответствие компилятор принимает добросовестно. Я предпочитаю, чтобы мой компилятор не доверял мне и имел возможность применять надежные проверки типов. Ошибки подстановки шаблонов, выдаваемые компиляторами C ++, болезненно читать, но, по крайней мере, мусор не компилируется.
gd1
1
@ gd1 Возвращаясь к вашему первому комментарию, я не знаю, сколько у вас опыта работы с процедурными техниками (я вижу, вы активны в основном в объектно-ориентированных тегах). void*Обычно можно избежать. Типичным шаблоном при добавлении настраиваемого поведения является передача указателя функции и void*пользовательских данных. Общий интерфейс обычно выглядит так. Затем библиотека передает это void*обратно в ваш обратный вызов, ничего не делая с ним. Чаще всего у вас нет дополнительных данных, поэтому вы передаете NULL и игнорируете пользовательский параметр в обратном вызове. Я предполагал, что вы это знали.
Calmarius
@Calmarius "Чаще всего у вас нет лишних данных" -> На самом деле это преимущество полиморфизма. Дополнительные данные легко привязать без использования указателей void. Итак, ваше оправдание: «Я все равно не использую эту функцию».
user2445507
15

Я удивлен, что никто не упомянул библиотеки. Многие языки могут связываться с библиотеками C и вызывать функции C (включая C ++ с extern "C"). C ++ - практически единственное, что может использовать библиотеку C ++ (определенную как 'библиотека, которая использует функции C ++, которых нет в C [такие как перегруженные функции, виртуальные методы, перегруженные операторы, ...], и не экспортирует все через интерфейсы, совместимые с C, через extern "C" ').

BigSandwich
источник
1
Не так; вы можете extern «C» или __cdecl ваши функции, чтобы предоставить их C.
Crashworks
Отлично, но с какими еще языками это работает?
BigSandwich
2
C lib может работать в гораздо большем количестве мест.
BigSandwich
1
Все те, которые могут ссылаться на C.
Crashworks
2
Самая очевидная причина проблем совместимости - это искажение имен, и я думаю, что об этом стоит вспомнить.
Tom
15

Если вы хотите, чтобы ваш код был понят практически любому программисту, пишите на C.

Лиран Ореви
источник
12

Потому что они хотят использовать возможности C99, у которых нет эквивалентов в C ++.


Однако не так много функций C99, которые полезны для C ++, как люди думают на первый взгляд. Массивы переменной длины? В C ++ есть std :: vectors. Поддержка комплексных / мнимых чисел? C ++ имеет шаблонный сложный тип. Типовые математические функции? C ++ перегружал стандартные математические функции, что привело к тому же результату.

Именованные инициализаторы? Не в C ++, но есть обходной путь:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Это позволяет писать такие вещи, как:

My_class mc(My_class_params().set_i(5).set_name("Me"));
Макс Либберт
источник
Слышу, слышу! Отсутствие именованных назначенных инициализаторов в C ++ заставляет меня нервничать каждый раз, когда мне приходится его использовать.
ephemient
2
Я со 100% инициализаторами !!!
Судья Мэйгарден,
Если вы хотите инициализировать глобальную структуру вне функции (поэтому вы не можете .set _ * ()), C ++ вынуждает вас использовать безымянный синтаксис инициализатора или написать конструктор для вашей структуры. Мне не нравится ни один из этих вариантов.
ephemient 01
В C99 (GCC) также есть VLA, с которыми намного проще работать, чем std:vector.
Вахид Амири
10

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

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

dkretz
источник
8

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

Если ваша система живет сама по себе, как в случае со многими приложениями, то C ++ - прекрасный выбор.

Если вашей системе необходимо взаимодействовать с программным обеспечением, которое не обязательно написано на C ++ (чаще всего на ассемблере или библиотеках Fortran), то вы находитесь в затруднительном положении. Чтобы взаимодействовать с такими случаями, вам нужно отключить изменение имен для этих символов. обычно это делается путем объявления этих объектов extern "C", но тогда они не могут быть шаблонами, перегруженными функциями или классами. Если это, скорее всего, API ваших приложений, вам придется обернуть их вспомогательными функциями и синхронизировать эти функции с фактическими реализациями.

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

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

TokenMacGuy
источник
3
Я очень удивлен, услышав это, потому что я написал так много .DLL на C ++, которые имели внешние интерфейсы "C", чтобы их можно было вызывать из C или любого другого языка CLR. Конечно, вы не можете просто выставить указатели на функции-члены, но на самом деле это не проблема с маршалингом данных для вызова __cdecl.
Crashworks
1
Фактически, вы можете экспортировать шаблонный код. Для этого просто требуются оболочки без шаблонов для каждого типа, который вы хотите использовать, чтобы избежать конфликтов имен.
Судья Мэйгарден,
8

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

vinc456
источник
8
Мудрые ваши учителя!
Андрей Чобану,
6

Одно замечание по поводу «просто используйте подмножество C ++, которое вы хотите использовать»: проблема с этой идеей состоит в том, что требует, чтобы все участники проекта использовали одно и то же подмножество. Мое собственное мнение состоит в том, что эти затраты довольно высоки для слабо связанных проектов (например, проектов с открытым исходным кодом), а также что C ++ полностью не смог стать лучшим C в том смысле, что вы не можете использовать C ++ везде, где вы использовали C.

Дэвид Курнапо
источник
6

О боже, C против C ++, отличный способ начать войну пламени. :)

Я думаю, что C лучше для драйвера и встроенного кода.

В C ++ есть несколько замечательных функций, которых нет в C, но многие из объектно-ориентированных функций C ++ могут вызывать колоссальные беспорядки при написании кода, когда люди пишут код с неочевидными побочными эффектами, которые возникают за кулисами. Сумасшедший код может быть спрятан в конструкторах, деструкторах, виртуальных функциях ... Красота кода C заключается в том, что язык не делает ничего неочевидного за вашей спиной, поэтому вы можете читать код и вам не нужно смотреть на каждый конструктор и деструктор и так далее. Большая часть проблемы - это плохая практика кодирования НЕКОТОРЫМИ людьми.

Мой идеальный язык был бы комбинацией C99 плюс минимальное подмножество более безопасных возможностей C ++, которые добавляют НУЛЕВЫЕ (или почти нулевые) накладные расходы компилятора к двоичному выводу. Прекрасным дополнением будет инкапсуляция классов и концепции именования данных и функций.

просветление
источник
Назовите его C + или C100: _)
m3nda
4

Мне не удалось найти много доказательств того, почему вы хотели бы выбрать C вместо C ++.

То, что я собираюсь сказать, вряд ли можно назвать доказательством; это просто мое мнение.

Людям нравится C, потому что он прекрасно вписывается в сознание программиста.

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

Другой вопрос, почему организации предпочтут C перед C ++. Не знаю, я просто человек ;-)

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

Йонас Кёлкер
источник
2
++score: Ваше утверждение «Людям нравится C, потому что он прекрасно вписывается в сознание программиста» очень хорошо сформулировано. Возможность программировать на простом языке, когда вы знаете, что то, что вы видите, - это то, что вы получаете, - это действительно привлекательное свойство для языка программирования.
tchrist
3

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

Крис
источник
Вы можете привести примеры из этого?
Эндрю Грант
Значит, тот же код C, скомпилированный с помощью компилятора C, будет более эффективным, чем при компиляции с использованием компилятора C ++?
Стив Куо,
1
Много лет назад ядро ​​Linux можно было скомпилировать с помощью gcc или g ++, но g ++ создавал более медленный код ( tux.org/lkml/#s15-3 в разделе «Наконец, пока Линус поддерживает ядро ​​разработки ...»).
Макс Либберт,
Полагаю, я больше думал о том, чтобы иметь возможность больше контролировать оптимизацию вашего кода на C, а не на C ++. Подобно тому, как программист, использующий язык ассемблера, может более точно настроить свой код, чем программист, использующий язык более высокого уровня.
Крис
2

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

Crashworks
источник
1

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

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

Electrons_Ahoy
источник
3
Проблема не столько в самом C ++, сколько в языке, а в патологическом раздувании, которое может вызвать неизбирательное использование шаблонов.
Crashworks
1
ecos в основном написан на C ++. Нет никакой связи между языком (по сравнению с C) и размером исполняемого файла (если вы знаете, какие функции использовать).
user52875
1
«при условии, что вы знаете, какие функции использовать». Это точка - результат говоря : «Ну, у нас есть C ++, но мы не можем поддержать половину возможностей языка для воздушных причин» является Symbian / C ++, которая путает и возмущает как программист C и программист на C ++ ...
Steve Джессоп
1
Договорились по всем пунктам. Наше решение «знать, какие функции использовать» заключалось в том, чтобы просто использовать компилятор C и положить этому конец. Конечно, мы могли бы заставить C ++ работать (что было бы действительно весело для супер-ботаника), но у нас был продукт для отправки, и у нас не было времени беспокоиться об этом.
Electrons_Ahoy
1

Что C был нужен, так это лучший препроцессор. cfront был одним и таким образом родился c ++

Я бы использовал C, где «c ++ как препроцессор» не годился бы.

Я почти уверен, что внизу любой хорошо написанной библиотеки / фреймворка / инструментария С ++ вы найдете грязный-старый-c (или статические приведения, что то же самое)

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