Навіщо хтось використовувати C над C ++? [зачинено]


132

Хоча люди, схоже, хочуть скаржитися на C ++, я не зміг знайти багато доказів того, чому ви хочете вибрати C над C ++. C, здається, не отримує майже такої кількості виправлень, і якщо C ++ має всі ці проблеми, чому ви не можете просто обмежитися підмножиною C? Які ваші думки / досвід?


точний дублікат посилання більше не працює ..... каже хлопець, який спізнюється на партію c :)
kyle

4
C справді краще і простіше C ++, але будь-який програміст на C може перетворити C ++ на C і посміятися.
BobRun

11
Страшні речі - люди взагалі думають, що "++" означає, що це справді gooooood, вибачте, це не так.
BobRun

Крім очевидних - маленькі / вбудовані пристрої - загалом, C краще для проблем з чистим числом (наприклад, обробка графічної графічної графіки, масові паралельні обчислення фізики, видобуток візерунків тощо), де функції OOP є процвітаючим. C ++ краще для моделювання систем, де 'речі' взаємодіють, набагато простіше з можливостями OOP.
Пейсман

3
Оскільки JavaScript, найкращі практики, c ++ та OOP дурні / занадто зайняті намаганням вирішити ці абстрактні проблеми, які, ймовірно, насправді не існують або потребують вирішення будь-коли.
маршальське ремесло

Відповіді:


132

Відповідь Джоеля хороша з тих причин, які, можливо, доведеться використовувати 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. (віртуальний, спробувати / кинути, динамічний_каст). Значна частина накладних даних відображається лише в розмірі зображення програми.
Зан Рись

88

Мені подобається мінімалізм і простота.


9
Гаразд - досить справедливо ... так чому б не Forth?
Джонатан Леффлер

14
Я б здогадувався, що йому також подобається наявність бібліотек, книг, форумів?
gnud

30
мені подобається мінімалізм і простота вашої відповіді ... :)
Joe DF

8
Погодьтеся. C дуже простий і "маленький". C завжди виглядають однаково, і якщо ви є новим учасником проекту, легко зрозуміти, як це працює. c ++ має багато непотрібних речей, і, дивлячись на проект c ++, я просто моментально плутаюся. Я можу зрозуміти людей, що знаходяться на мові С ++ (мова С з можливостями ОО), але C просто простіший і легший.
user69969

1
Крім того, я думаю, що C набагато краще підходить для написання певних бібліотек, наприклад, невеликих універсальних бібліотек, мов скриптів і, так, двигунів візуалізації.
keebus

65
  • Тому що вони вже знають С
  • Оскільки вони створюють вбудований додаток для платформи, на якій є лише компілятор C
  • Оскільки вони підтримують застаріле програмне забезпечення, написане на мові C
  • Ви пишете щось на рівні операційної системи, механізму реляційних баз даних або роздрібної машини для відеоігор.

4
Деякі мікроконтролери мають лише компілятори C, які справді смокче. Основні функції C ++ (простори імен, класи крім віртуальних функцій, перерахунки, декларування змінних в інших місцях, окрім топ-блоку) є найбільш цінними, IMHO.
Jason S

2
З цього виходить, що ви вибрали б C, лише якщо немає розумних альтернатив.

2
@Joe: окрім першого пункту, що підсумовує це. Багато пізніших мов взяли С і сказали: "Ей, ми можемо краще ".
Джоел Куехорн

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 та constructurs / destructors, тому реалізується по-різному у кожного постачальника, і навіть версій інструментарію постачальників.

У реальному розумінні це означає, що ви не можете взяти бібліотеку, створену одним компілятором, і зв’язати її з кодом або бібліотекою з іншого, що створює кошмар для розповсюджених проектів або провайдерів програмного забезпечення бінарних бібліотек.


7
"Інтерпретований Python багато в чому вважається" повільною "мовою, але для нетривіальних завдань досвідчений програміст Python може легко створити код, який виконується швидше, ніж у недосвідченого розробника C". Я думаю, що програміст (не обов'язково Python Progammer), який брав уроки алгоритмів, може створити код, який виконується швидше, ніж у недосвідченого розробника (загалом).
Андрій Чобану

15
І той самий недосвідчений c-розробник буде виробляти код python, який повільніше, ніж його c-код. Python набагато повільніше, ніж c.
Міллі Сміт

37

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


re: PIC - я відчуваю твій біль. Якщо мені коли-небудь доведеться робити багато коду PIC, я, ймовірно, використовувати компілятор IAR, який підтримує C ++. Я використовував його на MSP430, і це дуже приємно.
Jason S

1
І не забувайте про значно покращені часи компіляції для C. Без системи шаблонів.
Інженер

35

Я вважаю інше: чому використовувати C ++ замість C?

У книзі Мова програмування на C (він же: K&R) чітко розповідає про те, як зробити все, на чому може працювати мова на 300 сторінках. Це шедевр мінімалізму. Жодна книга на C ++ навіть не наближається.

Очевидний контраргумент полягає в тому, що те саме можна сказати і про більшість, якщо не всіх сучасних мов - вони також не можуть сказати вам, як зробити все лише за кілька сотень сторінок. Правда. То чому б замість цього використовувати C ++? Особливість багатства? Влада? Якщо вам потрібно щось більш багате чи потужне, тоді перейдіть за допомогою C #, Цілі C, Java чи іншого подібного. Навіщо обтяжувати себе складністю C ++? Якщо вам потрібен ступінь контролю за грантами на C ++, то я стверджую, що використовувати C. C може робити все, що завгодно, і це може зробити добре.


Я згоден. Я хочу влади, тому я використовую щось по-справжньому потужне, а не 1/2 точки.
Діна

7
@Dinah: Точка в 1/2 шляху дає вам потужність вираження більш високого рівня без продуктивності та вартості пам'яті на C # або Java.
Зан Лінкс

5
@Zan Lynx: ти маєш рацію. Але я сподіваюсь, що зайнявши протилежну позицію, яку я висловив у своєму первісному дописі, що я зазначав про життєздатність C над C ++ ... навіть якщо це, як ви зазначаєте, не є відкритим і закритим випадком.
Діна

28

Окрім кількох інших згаданих моментів:

Менше сюрпризу

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

У багатьох випадках ця магія є приємною, але, наприклад, в системах реального часу вона може насправді перекрутити ваш день.


27

Відповідь Лінуса на ваше запитання: "Тому що C ++ - жахлива мова"

Його свідчення в кращому випадку є анекдотичними, але він має сенс ..

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

Додавання посилань:

Чому C ++ для вбудованих

Чому ви все ще використовуєте C? PDF

Я б хотів до google за це .. тому що в Інтернеті вже багато коментарів


17
Я багато робив кодування в C, потім короткий проміжок часу в C ++, потім невпинно довгий час з VB, і зараз я використовую C # останні кілька років. Я написав трохи C і C ++ коду з тих пір і зрозумів, що C чітко визначений і щільний, C # крутий і потужний, а C ++ просто відстійний.
CMPalmer

25
Лінус не справді кваліфікований, щоб говорити про достоїнства C ++. Цитувати його так, ніби він якийсь оракул, просто нерозумно. А дещо про те, щоб зробити справи важким шляхом, не має сенсу. Є вагомі причини використовувати C, але "це більше роботи", або "Лінус сказав так" серед них немає.
jalf

8
@jalf, не цитуючи Лінуса так, ніби він якийсь оракул, добре згадати думку знаючого програміста щодо його вибору в одній з найбільш використовуваних програм у світі: Linux Linux. Питання запитує думки (чому хтось обрав би С), на що я мав на меті відповісти.
Рік Токіо

6
Лінус - це погане джерело думок щодо C ++, оскільки він не використовує його, і, наскільки я знаю, спробував це лише один раз у 1990 році.
Зан Лінкс

3
@Zan Linus виявив більше самоконтролю в іншому місці: "Нам би хотілося використовувати C ++ та додаткові функції, які він приносить, але важче зрозуміти, де поганий код у C ++, ніж у C". Цитата на мою відповідь - це запис думки, а не "слідувати за лідером".
Рік Токіо

26

Оскільки вони пишуть плагін, а C ++ не має стандартного ABI.


9
Хоча це правда, це не є переконливою причиною дотримуватися C, оскільки ви можете експортувати необхідні функції за допомогою C-зв’язку і все одно тримати свою реалізацію в C ++.
codelogic

2
@codelogic - проекти C ++, як правило, експортують набагато більше типів і функцій, ніж еквівалентні проекти C. Можна сховати це в остаточній спільній бібліотеці, але це, можливо, більше зусиль, ніж це варто.
Том

tbh не дуже хороша відповідь, але +1, тому що C ++ не має стандартного ABI (так .. C ++ смокче)
hasen

6
C також не має стандартного ABI.
Стівен Канон

25

Тривалий час компіляції може дратувати. З C ++ у вас може бути дуже довгий час компіляції (що, звичайно, означає, більше часу для переповнення стека!).


Чому це було проголосовано? Я багато працюю в C ++ сам, і я не повернуся до C, але це дійсно може мати болісно довгі часи компіляції (подумайте, наприклад, про шаблони).
Френк

6
Я використовую C ++ для реальної роботи, але я завжди прототипую в C через майже миттєвий час компіляції.
Том

Гм, коли це зроблено правильно, тобто не роздувши ми, може, нам знадобиться, ці - # включає і не впевнені, що це правильно включає час компіляції акуратні. Коли я зламаю один або три файли, мені потрібно лише 1-2 секунди, щоб скласти мої 100 проектів KLOC.
Себастьян Мах

4
@Tom: Цікаво, як виглядає твоя справжня робота C ++, якщо ти можеш прообразувати в C. Ви не використовуєте можливості C ++? Чи можете ви докладно?
Себастьян Мах

24

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

3 речі, які мені подобаються в C, це:

  • Нічого не мається на увазі: ви бачите, що саме робить ваша програма чи ні. Це полегшує налагодження.

  • Відсутність просторів імен та перевантажень може бути перевагою: якщо ви хочете знати, де називається певна функція, просто прогляньте каталог вихідного коду, і це вам скаже. Ніяких інших спеціальних інструментів не потрібно.

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


8
+1 Однак, такий поліморфізм у C зазвичай отримується через void *, що небезпечно, оскільки він відключає будь-яку здатність компілятора перевіряти, чи робиш ти щось недобре.
gd1

4
@ gd1 На практиці я не можу згадати жодного випадку, коли це void*спричинило проблеми. Існує багато методів оборонного програмування для захисту від помилок: введення заявок скрізь, додавання магічних чисел у ваші структури (в налагодженнях) і т. Д. Але в наш час у нас є вальгринд, д-р. пам'ять і навіть MSVC інструментує код для виявлення проблем, тому проблеми з пошкодженням пам'яті досить легко розібратися.
Кальмарій

4
Я майже ніколи не відчуваю пошкодження пам’яті у своїх програмах, але, якщо можливо, я б вважав за краще помилки виявлятись перед запуском програми. Кастинг void*на whatever*те, що компілятор добросовісно приймає. Я вважаю за краще, щоб мій компілятор не довіряв мені і мав можливість застосовувати надійні перевірки типу. Помилки підстановки шаблонів, видані компіляторами C ++, важко читати, але принаймні сміття не збирається.
gd1

1
@ gd1 Назад до вашого першого коментаря, я не знаю, який у вас досвід роботи з процедурними методами (я бачу, що ви активні в основному теги OO). void*Зазвичай можна уникнути. Типовою схемою при додаванні нестандартної поведінки є передача функції покажчика та void*даних для даних користувача. Загальний інтерфейс зазвичай виглядає так. Потім бібліотека, коли передає цей void*зворотний дзвінок, не роблячи з ним нічого іншого. Найчастіше у вас немає додаткових даних, тому ви передаєте NULL та ігноруєте параметр користувача у зворотному дзвінку. Я припускав, що ви це знаєте.
Кальмарій

@Calmarius "Найчастіше у вас немає зайвих даних" -> Це насправді перевага поліморфізму. Пов’язати додаткові дані легко, не використовуючи недійсних покажчиків. Отже, ваше виправдання в основному "я дійсно не використовую цю функцію в будь-якому випадку".
user2445507

15

Я здивований, що ніхто не згадує бібліотеки. Багато мов можуть пов'язуватися з C libs та викликати функції C (включаючи C ++ із зовнішнім "C"). C ++ - це майже єдине, що може використовувати C ++ lib (визначається як "lib, який використовує функції C ++, яких немає в C [такі як перевантажені функції, віртуальні методи, перевантажені оператори, ...]) і не експортує все через сумісні з C інтерфейси через зовнішній "C" ').


1
Не так; ви можете викреслити "C" або __cdecl свої функції, щоб піднести їх C.
Crashworks

Чудово, але з якими іншими мовами це працює?
BigSandwich

2
a C lib може працювати в набагато більших місцях.
BigSandwich

1
Усі ті, хто може посилатися на C.
Crashworks

2
Найбільш очевидною причиною проблем інтероперабельності є керування іменами, і я думаю, що це варто підняти.
Том

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 ++ підштовхує мене до стіни кожен раз, коли мені доведеться її використовувати.
ефемія

2
Я на 100% на ініціалізаторах !!!
Суддя Мейґарден

Якщо ви хочете ініціалізувати глобальну структуру поза функцією (тому ви не можете .set _ * ()), C ++ змушує вас використовувати неназваний синтаксис ініціалізатора або написати конструктор для вашої структури. Мені не подобається жоден із цих варіантів.
ефемія

Також у С99 (GCC) є VLA, з якими набагато простіше працювати std:vector.
Вахід Амірі

10

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

ОТОН, для більш складних проектів елегантність забезпечує більш хорошу структурну жорсткість, ніж природно витікає з моєї клавіатури.


8

Більшість значущих особливостей c ++ якимось чином включають класи або шаблони. Це чудові функції, за винятком того, як компілятор перетворює їх у об'єктний код. Більшість компіляторів використовують керування іменами, а ті, що щось не роблять, принаймні як безладні.

Якщо ваша система живе самостійно, як це відбувається у багатьох програмах, тоді C ++ є прекрасним вибором.

Якщо вашій системі потрібно взаємодіяти з програмним забезпеченням, яке не обов'язково написано на C ++ (найчастіше в асемблері або в бібліотеках Fortran), ви опинитесь в тісному місці. Для взаємодії з подібними випадками вам потрібно буде відключити керування іменами для цих символів. зазвичай це робиться шляхом оголошення цих об'єктів extern "C", але тоді вони не можуть бути шаблонами, перевантаженими функціями чи класами. Якщо це, швидше за все, API вашого додатка, вам доведеться обернути їх допоміжними функціями та тримати ці функції в синхронізації з фактичними реалізаціями.

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

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


3
Я дуже здивований, почувши це, тому що я написав так багато .DLL в C ++, що мали зовнішні інтерфейси "C", щоб їх можна було викликати з C або будь-якої іншої мови CLR. Звичайно, ви не можете просто розкрити покажчики функцій членів, але це дійсно не так багато проблем з маршаловими даними для виклику __cdecl.
Crashworks

1
Насправді ви можете експортувати шаблонний код. Він просто вимагає обгортання функцій, що не є шаблоном, для кожного типу, який ви хочете використовувати, щоб уникнути зіткнень імен.
Суддя Мейґарден

8

Це досить неглибоко, але, як зайнятий студентом, я вибрав C, оскільки думав, що C ++ займе багато часу, щоб навчитися. Багато викладачів мого університету не приймуть завдання з Python, і мені потрібно було швидко підібрати щось.


8
Мудрі ваші вчителі!
Андрій Чобану

6

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


6

О мій, C проти C ++, чудовий спосіб почати полум'яну війну. :)

Я думаю, що C краще для драйвера та вбудованого коду.

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

Моєю ідеальною мовою було б поєднання C99 плюс мінімальний підмножина більш безпечних можливостей C ++, що додає компілятор ZERO (або близько нуля) накладні витрати на двійковий вихід. Ідеальним доповненням було б інкапсуляція класів та називання понять даних та функцій.


Назвіть це C + або C100: _)
m3nda

4

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

Ви навряд чи можете назвати те, про що я хочу сказати докази; це лише моя думка.

Людям подобається C, оскільки він добре вписується у розум програмиста.

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

Інше питання, чому організації віддають перевагу C над C ++. Я цього не знаю, я просто народ ;-)

На захист C ++ це вносить цінні риси в стіл; той, котрий я найбільше ціную, - це, мабуть, параметричний ('ish) поліморфізм, хоча: операції та типи, які приймають один або кілька типів як аргументів.


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 зухвальниками C), але не STL, оператори потоку та Boost (які важче вивчити та можуть мати погані характеристики пам'яті).


1

Тому що ви пишете для системи, де ресурси обмежені (наприклад, вбудована система чи якийсь справжній голий металевий код, як ядро), і вам потрібно якомога менше накладних витрат.

Існує причина, чому більшість вбудованих систем не мають компілятора C ++ - справа не в тому, що люди не хочуть цього, це те, що зуміння коду С ++ у цей невеликий простір - це завдання, підходи до якого неможливо.


3
Насправді не стільки проблема C ++, як мови, але патологічний розквіт, що нерозбірливе використання шаблонів може спричинити.
Crashworks

1
ecos багато в чому написано на C ++. Немає зв’язку між мовою (порівняно з С) та розміром виконавчого файлу (доки ви знаєте, якими функціями користуватися).
user52875

1
"поки ви знаєте, якими функціями користуватися". У цьому справа - результат сказати: "ну, у нас є C ++, але ми не можемо підтримувати половину мовних функцій із накладних причин" - це Symbian / C ++, що плутає і зліть як програмістів на C, так і програмістів на C ++ ...
Стів Джессоп

1
Погоджено по всіх пунктах. Нашим рішенням "знати, які функції використовувати" було просто використовувати компілятор C і називати його щодня. Звичайно, ми могли зробити так, щоб C ++ працював (що справді було б цікаво супер-ботанічним способом), але у нас був продукт, який потрібно відправляти, і ми не мали часу турбуватися про це.
Electrons_Ahoy

1

Що потрібно C було кращим препроцесором. cfront був одним і таким чином народився c ++

Я б використовував C, де "c ++ як препроцесор" було б не в порядку.

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


0
  • Ще кілька років тому існуючим компіляторам C ++ не вистачало важливих функцій, або підтримка була поганою, і підтримувані функції сильно відрізняються серед них, і тому важко було писати портативні програми.
  • Через відсутність стандартного іменування символів для інших мов / додатків важко безпосередньо підтримувати класи C ++.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.