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