Коли використовувати C над C ++, а C ++ над C?


164

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

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

(Я також помітив, що у файлів C ++ майже завжди є відповідні заголовки, тоді як файлів C не так вже й багато). Але моя головна точка дослідження - отримати загальне відчуття інтуїції щодо того, коли доцільно використовувати C над C ++, і коли краще використовувати C ++ над C. Крім фактів, що (1) C ++ орієнтована на об'єкт, тоді як C - ні, і (2) синтаксиси дуже схожі, і C ++ був навмисно створений так, щоб багато в чому нагадувати C, я не впевнений, у чому їх відмінності. Мені здається, що вони (майже) ідеально взаємозамінні у багатьох областях.

Тож було б вдячно, якби хтось міг прояснити ситуацію! Дякую


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

30
@kylben: Багато хлопців на C ++ скажуть вам: (1) Продуктивність не є приводом для падіння до C (можливо, щоб уникнути virtualі деяких інших функцій, які запобігають оптимізації, але, наприклад, некласи за virtualсвоєю суттю неефективні, а шаблони - це потужний інструмент абстракції, який насправді може призвести до більш ефективного - наприклад, qsortпроти std::sort). (2) Високе значення коректності є причиною використання C ++ (typesafety, constness ,, privateRAII, щоб зробити управління ресурсами керованим тощо) над C. Або з цього приводу в першу чергу використовуйте Ada або щось таке.

11
@ Pubby8 Я не згоден з цим. Якщо я працюю над файлом .c і бачу, як люди це роблять, я подумки позначаю, що вони не знають, що вони роблять. Наприклад, немає необхідності переходити void*до іншого типу вказівника в коді С, це дуже відволікає і типово для людей, які не знають C.
asveikau

4
@kylben: (Можливо, ви хочете навчитися правильно звертатися до інших у своїх коментарях-відповідях, тому вони мають шанс реально їх побачити .) "Програміст, дуже добре знайомий з тим, як компілятор перетворює C в asm", працював би для C ++ так само, як Ну. Але це просто не має значення: Якщо ви хочете справитись з asm, просто напишіть asm, а не компілятор створити його з іншої мови. Зрештою, це може змінитися з кожним оновленням компілятора.
sbi

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

Відповіді:


184

Ви вибираєте С, коли

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

У всіх інших випадках вам слід вибрати C ++.


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

12
@SF: C - це lingua franca? Це нове. А точніше, дуже старий. Можливо, якщо ви спілкуєтесь лише з людьми, які не вивчали нових мов протягом останніх 20 років, але я б сказав, що знання C вже не дуже поширені.
DeadMG

13
@SF. Як я вже писав десь, я був у проектах, що нараховували мільйони ЛоК, і побачив дуже мало мета-матеріалів у порівнянні з проектами C із їх неминучим і всюдисущим маккером. (OTOH, можливість створювати EDSL, коли це потрібно, може бути неймовірно потужним інструментом у вашій коробці.) Що стосується C - це lingua franca: я б скоріше дотримувався свого терміна, що це найменший загальний знаменник. І я не хотів би, щоб люди з помірними навичками програмування зламали ядро ​​ОС.
sbi

18
@Max: Я повністю не згоден. C - марна мова, за винятком випадків, коли якийсь нездоланний практичний бар'єр не перешкоджає використанню C ++.
DeadMG

17
@Buttons: саме ви подали претензію ("C ++ потребує більше пам'яті"), тому саме ви повинні зробити це резервним. І, ні, я не стверджую, що C ++ потребує менше пам’яті. Що я говорю, це те, що функції коштують, незалежно від того, компілятор реалізує їх для вас (віртуальні функції) чи ви їх виконувати самостійно (масив покажчиків функцій).
sbi

88

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

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

Інший час / причина використання C - це надання набору функцій, до яких ви можете пов'язувати по суті з будь-якої іншої мови. Ви можете записати ці функції в C ++, визначивши їх як extern "C"функції, але це обмежує ці функції до того, щоб представити світові фактично "обличчя" C - життя - класи, перевантажені функції, шаблони та функції членів тощо. застосувати. Це не обов'язково обмежує розробку лише C - цілком розумно використовувати будь-які функції C ++ всередині , якщо зовнішній інтерфейс виглядає як C.

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

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

Автоматизовані інструменти - це також червона оселедець. Хоча це правда, що писати аналізатор С - це не менше роботи, ніж писати аналізатор С ++, але в реальності це практично не має ніякої різниці. Дуже мало людей бажають чи вміють написати зручний аналізатор для будь-якого. Таким чином, розумною відправною точкою є Кланг в будь-якому випадку.

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


12
Підтримка інструменту - це не червона оселедець. Зрозуміло, сьогодні ми маємо клаксоном. Але підтримка інструменту для C ++ робить істотно відстає Одер мов, навіть у великому пострілі Іде. Чому так? Просто, тому що до недавнього часу не було ні клаксону (а GCC ніколи не була альтернативою). Поки, можливо, півроку тому, якщо вам знадобився AST код C ++, вам в основному не вистачало удачі чи тисячі доларів (якщо ви купували фронтальний EDG).
Конрад Рудольф

5
+1, і для запису я регулярно пишу код C ++ для 8-бітових процесорів із 4-кілометровими ПЗУ.
авакар

2
+1 за загальну чудову відповідь. Що я не розумію (у мене немає досвіду Wrt. Це) саме тому (я думаю, ми говоримо про вбудований?) Компілятор C повинен створювати менший виконуваний код, ніж компілятор C ++ з тим самим набором функцій, що використовується ? Можливо, ви могли б надати кілька посилань?
Мартін Ба

2
@Martin: головне, щоб C ++ включав обробку виключень, що (принаймні зазвичай) додає певного мінімуму до виконуваного розміру. Більшість компіляторів дозволить вам відключити обробку виключень, але коли ви зробите результат, це не зовсім C ++. Я підозрюю, що є також трохи від простого факту, що багато постачальників компіляторів C ++ просто не працюють настільки важко, щоб створити найменший можливий вихідний код.
Джеррі Труну

3
"Ми виявили, що використання C ++ замість C призводить до поліпшення якості програмного забезпечення та зниження зусиль щодо обслуговування ...", про що слід пам'ятати.
Стефан Ролланд

24

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

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


51
-1за розпусту Лінуса. : - {
sbi

12
Не мінусуйте мене за це! Ха-ха. Я не згоден з Лінусом, але це досить хороший приклад ЧОМУ люди можуть вибрати C над C ++ (якщо вони вірять у те, що вважає Лінус). Я не коментую законність цих причин.
Кейсі Паттон

10
@CaseyPatton: В основному, я схвалюю кожну відповідь, яка представляє цю риторичну незвичку, коментується так, ніби це справжній аргумент.
sbi

11
@Coder: Вам взагалі не потрібно знати впровадження STL. Сама суть STL полягає в тому, що вам не доведеться знати впровадження, якщо ви не покладаєтесь на поведінку, не визначену стандартом. У такому випадку, навіщо турбуватися з використанням бібліотеки Standard? Більше того, це не більше ніж божевільне не любити мову через те, як ведуть себе розробники. Програмісти C поводяться так, як C - це Божий дар людині і занадто сліпий, щоб побачити очевидну істину, що C ++ пропонує функції, які принципово і внутрішньо безпосередньо переважають C, як RAII.
DeadMG

8
@Coder: Якщо ви потрапили з такою кількістю спільних_ptrs в один об'єкт, що ви переповнюєте внутрішній лічильник, ви робите це неправильно. Стандарт визначає мінімальний розмір для лічильника, ймовірно, 32-бітного, і досить нереально мати більше 2 мільярдів shared_ptrs для одного об'єкта. Навіть якщо сам об’єкт мав 0 розмірів, а у вас був розподільник пам'яті з нульовим режимом, то ви все ще споживаєте 16 Гб пам'яті, лише на shared_ptrs.
DeadMG

13

Основна проблема, яку не вистачає в існуючих відповідях (станом на час цієї публікації) - вибір.

Це просто. Якщо з якихось ірраціональних причин ви вважаєте, що винятки не варті накладних витрат, тоді не потрібно їх використовувати . Ви ще можете мати шаблони, і RAII, і бібліотеку Standard, і ніколи не писати жодного "кидка". Те саме стосується шаблонів. Якщо з якоїсь причини ви відчуваєте, що вони спричиняють безповоротний (і насправді важливий, який є лише у вбудованому) виконуваним нальотом, то сюрприз - ви можете використовувати void * та sizeof (T) і цілий день. Ніщо не змушує вас використовувати будь-яку з функцій C ++ понад C.

Ось чому C ++ є суттєво чудовою мовою - ви можете вишнево вибрати потрібні функції та повернутися до програмування в стилі C, коли вам не подобається дана функція. Тому, враховуючи, що C ++ - це все, що є C і більше, очевидним є факт, що C ++ є вищою мовою. Пропонувати інакше - це як намагатися припустити, що 4 більше, ніж 5.


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

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

1
@DeadMG: Як призначені алокатори повідомляти про помилки, не кидаючи винятків? Крім того, додавати більше функцій не обов'язково краще, коли все, що він робить, - це додавати складності або надмірності.
Манкарсе

@Mankarse: Якщо ви компілюєте з параметрами відключення винятків, алокатори або припиняють програму, або весело продовжують використовувати нульовий покажчик, залежно від реалізації бібліотеки.
Зан Лінкс

4
@Mankarse: З мого досвіду в 2007 році, коли я спробував запустити систему Linux з 1 Гб оперативної пам’яті і без підкачки, майже все програмне забезпечення для настільних комп’ютерів виходить з ладу жахливими способами, коли розподіл пам’яті все одно не вдається.
Зан Лінкс

9

Про C ++, які нервують програмістів на C

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

Залежно від того, що ви робите, можуть бути деякі нетривіальні накладні витрати, особливо для простих завдань. Візьміть дві наступні програми: перша на C, друга в C ++:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

Ідентична поведінка, не велика різниця в джерелі, але на графі SLES 10, над якою я працюю з gcc 4.1.2, перший генерує виконуваний файл розміром ~ 9 кб, тоді як другий займає 12,5 кбіт (без оптимізації) ), майже на 28% більше. Тип C ++ stringнабагато простіше працювати з IMO, ніж бібліотека струн C, а потоки C ++ набагато гнучкіші та налаштованіші, ніж потоки C, але для справді таких, як мозг мертвих кодів, вони можуть не коштувати накладних витрат.

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

Про C, які нервують програмістів на C ++

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

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

Аналогічно, поводження з помилками в C - це біль у попці порівняно з інструментами, які надає C ++ (а саме - винятки). Що насправді цікаво - це коли ти виділив купу пам’яті, а потім потрапив у стіну під час обробки; як вам доведеться відмовитися, ви повинні звільнити цю пам'ять у потрібному порядку. З принципами C ++ та RAII це зробити (відносно) просто.

То коли я використовую один над іншим?

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


2
Управління пам'яттю є складним і в деяких випадках схильним до помилок, але особливо у вбудованому світі часто практично писати програми C, використовуючи повністю статичний розподіл пам'яті. Якщо програма посилається, вона не може втратити пам'ять під час виконання. Чи можна легко домогтися таких гарантій у C ++?
supercat

9

Bjarne Stroustrup веде список програм та компаній, які використовують C ++; Ви можете сперечатися з приводу процесуального проти програмування OOP все, що вам потрібно, але ви не можете сперечатися з результатами галузі протягом останніх 20 років.

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

Стандартна бібліотека C ++ (STL), сама по собі з векторами та картами, є достатньою підставою для використання C ++.

C зазвичай використовується для вбудованих систем.

Я особисто використовував C, тільки якщо є якась бібліотека, яка має лише API API.


19
Ваше останнє речення не є підставою для використання C. Ви можете зателефонувати в бібліотеки C за допомогою C ++.
користувач207421

2
Я використовував c ++ для проекту DSP - не c
BЈович

9

Я б сказав, що головна причина, чому я обрала б C на C ++, - це лише тоді, коли мені доведеться вдатися до "НАСА такого роду".

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

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

Приклад: Чи знаєте ви, коли shared_ptr<smthn>переповниться його контрольний підрахунок, чи викине це виняток? Такі речі не круті, коли Шаттлу доводиться знову повертати атмосферу, принаймні я так гадаю.

Крім того, обробка виключень дуже, дуже складна порівняно з кодами помилок. Важко зрозуміти, чи клас на 100% безпечний для винятків, і легко потрапити в протікання. Дуже багато високих представників людей висловили цю думку.


12
І яким чином саме вручну керувати пам'яттю "стабільніше", ніж абстракції на C ++ "тощо std::string"? Ви коли-небудь намагалися вказати платформу, де shared_ptrлічильник переповнюватиметься? Це був би один чорт смішної платформи. І якщо ви вважаєте, що обробка винятків є складною, вам слід переглянути фрагмент коду С, який перевіряє наявність усіх можливих помилок при кожному виклику функції. (Такий код важко придумати, я визнаю, але це лише ще сильніший аргумент проти вашої заяви.) Вибачте, але це справді бичачі екскременти.
sbi

12
@Lundin: "" Це повинно бути стабільно на 1000% ", реалізації не дозволяють в першу чергу динамічного розподілу пам'яті". І що вас заважає робити саме це в C ++ ?? (І робити бланкетні заяви про свої знання та досвід, а не наводити будь-які аргументи - досить дешева риторика.)
sbi

10
@Lundin: Добре, що ви почали наводити аргументи, а не риторику. Але вони слабкі. Те, що ви "забули" одну з головних особливостей C ++ (шаблонів), таку, яка робить код безпечнішим (тому що дозволяє алгоритми виконувати - і, таким чином, не працювати - під час компіляції , усуваючи помилки під час виконання), не робить говоріть на користь вашого знання мови, яку ви судите. Зниження рівня C ++ до мови ООС раніше піддавалося критиці, і з поважних причин. (Крім того, заняття з детермінованою деструкцією - чудовий інструмент і корисний для управління іншими ресурсами, крім простої пам'яті.)
sbi

9
@Lundin Звичайно, ви не хочете використовувати, std::stringякщо ви не хочете динамічного розподілу. Ви б використали std::basic_string<char, std::char_traits<char>, some_allocator_here>.
Люк Дантон

10
@Coder: Як ти думаєш, що ти доводиш із цим? Перший - це просто поганий код (і це буде так само погані помилки звітності, як і значення повернення), другий робить випадок для RAII над ручним очищенням, до якого розвеселить кожного напівпристойного диска C ++, і Джоела, як і я поважай його, сказав кілька речей, з якими я абсолютно не згоден. Його штепсельна вилка для одиночного входу-одиночного виїзду погано нагадує старого неінформованого пердета, який ніколи не погодиться з тим, що те, що він дізнався 25 років тому, перевершило. (Майте в виду, я був програмування 25 років тому, коли SESE було стан техніки.)
ВГО

6

C - це портативна збірка з кращим синтаксисом, що дає програмісту повний контроль над усім .

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

  • не використовуйте більше пам'яті, ніж ви хочете
  • не отримуйте доступу до сторінок пам’яті мимоволі (віртуальний файл може бути де завгодно)
  • не викликайте багато коду випадково

І хочеться працювати з чимось справді простим, оскільки ви зосереджені на продуктивності.

Просто не має сюрпризів, і це дуже цінно.

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

Також С збирається, як ошпарений троль, вражений блискавкою. C ++, OTOH, ймовірно, фінансували ті самі люди, які інвестували в SSD компанії. :)

(Особисто я вважаю за краще C ++, але це мені не подобається ......; ;-P)


1
Є багато речей, над якими C не пропонує контролювати. Спробуйте написати ефективний портативний код, щоб помножити uint32_t на uint32_t, щоб отримати результат uint32_t (нижній 32 біт продукту). Якщо int64-бітовий, потрібно надати принаймні один операнд, щоб uint64_tзапобігти невизначеному поведінці, але для вирахування 32-бітного результату потрібно передати 64-бітне - м'яко кажучи - "дивно".
supercat

Це не. Компілятор робить такі речі, як розподіл реєстру для вас. Я не можу записати ремонтабельний код у збірку, в CI може.
Нільс

2

(якщо ви маєте рівне знайомство з обома мовами)

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

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


1

Обидві мови чудові. Я думаю, що в ряді плакатів детально описані сильні сторони та різні можливості використання для кожного. Я просто додам це:

Я бачу мову C ідеальною у 4-х областях: 1) Я думаю, що це найкраща мова, яка використовується під час першого вивчення будь-якого типу програмування [у поєднанні з деяким складанням та знаннями машинного коду], 2) чудово підходить для написання драйверів, 3) вбудований програмне забезпечення та 4) системне програмне забезпечення на найнижчому рівні.

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


0

На мою думку, у цій дискусії бракує одного пункту: Простіше на C забезпечити стабільний бінарний інтерфейс з бібліотеки. Як для використання з іншими мовами, так і з C ++.

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

Я знаю, що сьогодні компілятори часто мають комутатори для створення gcc-сумісних речей, але це не завжди допомагає.

Я спостерігаю це на Solaris порівняно часто. Зазвичай розповсюдження та різні постачальники програмного забезпечення використовують Sun Studio, оскільки, особливо в системах Sparc, це часто дає кращі результати. Людські проекти з відкритим кодом написані, проте, зі специфічним кодом gcc. Може нанести певний біль, щоб змусити тих, хто працює разом.


0

C, мабуть, кращий, ніж C ++, коли генерується код C (наприклад, у реалізаціях мов вищого рівня). Наприклад, є кілька компіляторів, схожих на Lisp, які видають код C (наприклад, Chicken , Scheme48 ...), але я не знаю жодного, який не видає справжній код C ++ (мій інструмент MELT видає код C ++, але я не буду називати цей код справжнім Код C ++, він використовує дуже мало функцій C ++).

Код С також простіше довести напівавтоматично. Статичні аналізатори на зразок Frama-C (де ви коментуєте свій код C за допомогою коментарів ACSL, щоб допомогти довести причину вашого коду) доступні для C, але не так вже й для повного C ++ 11.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.