Почему кто-то использует C над С++?

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

Ответ 1

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

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

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

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

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

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

Ответ 2

  • Потому что они уже знают C
  • Поскольку они создают встроенное приложение для платформы, на которой есть только компилятор C
  • Поскольку они поддерживают устаревшее программное обеспечение, написанное на C
  • Вы пишете что-то на уровне операционной системы, реляционной СУБД или розничной 3D-видеоигры.

Ответ 3

i, как минимализм и простота.

Ответ 4

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

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

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

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

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

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

Ответ 5

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

Ответ 6

Я беру другое представление: зачем использовать С++ вместо C?

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

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

Ответ 7

Поскольку они пишут плагин, а С++ не имеет стандартного ABI.

Ответ 8

Ответ Linus на ваш вопрос "Потому что С++ - ужасный язык"

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

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

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

Почему С++ для встроенных

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

Я бы google для этого.. потому что в Интернете уже много комментариев

Ответ 9

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

Ответ 10

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

Меньше сюрприза

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

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

Ответ 11

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

3 вещи, которые мне нравятся на C:

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

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

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

Ответ 12

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

Ответ 13

Поскольку они хотят использовать функции на C99, которые не имеют эквивалентов в С++.


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

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

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"));

Ответ 14

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

Ответ 15

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

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

Ответ 16

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

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

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

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

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

Ответ 17

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

Ответ 18

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

Ответ 19

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

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

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

Мой идеальный язык был бы комбинацией C99 плюс минимальный набор более безопасных возможностей С++, который добавляет служебные данные компилятора ZERO (или почти нулевого) к двоичному выходу. Идеальными дополнениями будут классовая инкапсуляция и обозначение понятий данных и функций.

Ответ 20

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

Ответ 21

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

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

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

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

Другой вопрос в том, почему организации предпочли бы C над С++. Я этого не знаю, я просто народ, -)

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

Ответ 22

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

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

Ответ 23

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

Ответ 24

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

Я использую C, где "С++ как препроцессор" будет не в порядке.

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

Ответ 25

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