Чи варто припинити використання терміна C / C ++?


140

Я розумію, що C і C ++ - це різні мови, але коли я вивчав C ++, мені завжди говорили, що C - це підмножина C ++ або C ++ - це C з класами. І це було цілком вірно до появи C ++ x0, C ++ 11 (або сучасного C ++ 11/14/17 взагалі). Насправді (особливо при роботі над вбудованими системами) дуже ймовірно знайти код, написаний на C ++, але з великою кількістю частин, написаних повністю чистою мовою C. Тут у мене є кілька питань:

  1. Чи варто припинити використання терміна C / C ++?
  2. Якщо відповідь на номер 1 - так, то як би я назвав програму, яка використовує суміш C і C ++?
  3. Зважаючи на те, що обидві вони є "різними" мовами, ймовірно, що в якийсь момент компілятори C ++ перестануть підтримувати код, написаний мовою С (оскільки сучасний c ++ розходяться з менталітетом C для основних елементів, таких як покажчики, динамічна обробка пам'яті тощо)
  4. Чи є зараз якась співпраця між людьми, які складають стандарти C / C ++ для збереження сумісності
  5. Якщо №4 так, така співпраця може закінчитися найближчим часом із появою сучасного c ++ (14.11.17)

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


35
І це було цілком правдою до появи C ++ x0, C ++ 11 Ні, C89 не є підмножиною C ++ 98.

35
Should I stop using the term C/C++. Так. Цим користуються лише рекрутери та HR. Інженери будуть використовувати термін Cабо C++як незалежні мови. Якщо ви знайдете інженера, який змішує термін, уникайте їх.
Мартін Йорк

8
@LokiAstari: справді? Я думаю, що розробники SQLite є HR, оскільки вони не мають відкритих позицій. Це надзвичайно обмежувальний погляд (будь ласка, перейдіть і скажіть мою відповідь так, як це зробили інші у вашій ситуації).

4
@greyfade: Дуже погано припускати, що будь-хто і будь-де може претендувати на загальновідому послідовність символів. "C / C ++" може бути ім'ям, вибраним для певної мови, але це не означає, що використання "C / C ++" відноситься до цієї мови, більше ніж якщо я скопіював цей веб-сайт і замінив "C / C ++" на "C ++ 1z", що все обговорення проекту стандарту C ++ раптом використовує неправильну термінологію. Простіше кажучи, рядок "C / C ++" ніколи не згадував цю мову жарту під назвою "C / C ++" і ніколи не буде.
Бен Войтт

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "У суворому математичному сенсі C не є підмножиною C ++ ... Однак C ++ підтримує будь-яку техніку програмування, що підтримується C ... Це не так нечасто за кілька годин можна перетворити десятки тисяч ліній C у C ++ у стилі C. Таким чином, C ++ є настільки ж супернабором ANSI C, як ANSI C - це супернабір K&R C і стільки, скільки ISO C ++ - це Набір C ++, як він існував у 1985 році. Добре написаний C, як правило, також є легальним C ++. Наприклад, кожен приклад в Kernighan & Ritchie: "Мова програмування на C (2-е видання)" також є програмою C ++ ".
Бен

Відповіді:


183

C ніколи не була підмножиною C ++. Найбільш очевидний приклад цього int new;. Це вірно з C89 та C ++ 98, і мови лише зростали одна від одної, коли з'явилися нові стандарти.

Чи повинен я припинити використання терміна C / C ++

Так

Якщо відповідь на номер 1 - так, то як би я назвав програму, яка використовує суміш C і C ++?

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

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

3) Вони ніколи цього не робили. char *a = malloc(10);. C і C ++ ніколи не були повністю сумісні принаймні до тих пір, як у них були стандарти ISO (я не знаю всіх деталей про попередньо стандартизовані дні). натисніть посилання або перегляньте нижче файл, який добре відповідає C89 і вище, але недійсний ні в одному зі стандартів C ++.

4) afaik ні, робочі групи знають одне про одного, але стандарти приймають рішення, які є найкращими для себе.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

Я завжди вважаю, що варто згадати, що C - це підмножина Objective-C.


59
Objective-C був розроблений спеціально для суворого набору С, без суперечливого синтаксису та повністю ортогональної об'єктної системи. Це сприймається настільки крайно, що ви можете фактично взяти "об'єктивну" частину "Objective-C" і перетягнути її на інші мови, створюючи, наприклад, Objective-MODULA-2. І найвідоміше, що Apple Objective-C ++ має дві повністю ортогональні, не взаємодіючі неінтегровані об'єктні системи.
Йорг W Міттаг

20
@masonwheeler, якщо ОП хоче побачити, як виглядає фактичний суперсет C.
xhainingx

26
"Вихідний файл записаний на одній або іншій мові." Скажіть це моїй програмі, яка чітко компілює як стандартний C99, так і C ++ 89. Жодна мова не є підмножиною іншої, але є перетин двох їх наборів, який широко націлений. Див. Lua та ін.
чудовий

28
@mulous Я можу написати код C ++, який теж може пройти javac, але який би сенс?
xhainingx

22
@mulous Приклад програми, яку можна скласти трьома мовами - C, / bin / sh і f77 - це запис applin.c до IOCCC 1986. Відповідно до вашого визначення, тег C/Fortran/shмає сенс зараз ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd

108

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

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

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

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

І т.д.

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

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

Не бійтеся майбутнього. Наші операційні системи написані на C. Досить багато поточного виробництва програмного забезпечення C / C ++ відбувається в C ++. Ця пара тут, щоб залишитися надовго. Ніхто не зацікавлений у тому, щоб один зробився більш несумісним з іншим (насправді навпаки).

Щоб уточнити ваші бали:

1) Це залежить. Так, коли це може призвести до плутанини, коли ви відчуваєте себе неприємно, або коли це просто неправильно або поза контекстом. Ні, коли ви думаєте, що це адекватно.

2) Ні / А

3) Я думаю, що ні, але у мене немає кришталевого кульки.

4) поняття не має

5) Я не думаю, що ніщо не підштовхує в цьому напрямку


7
Коментарі видалено, коли вони стають галасливими.
ChrisF

3
Чому для цього так багато відгуків? Це повне неточності та помилкових претензій!
Заїбіс

5
@Zaibis Ви б були люб'язними, щоб розширити, які твердження є помилковими чи неточними?
usernumber

3
Дотримуючись вашої логіки, C / C ++ / Objective-C / Fortran / Pascal має бути дійсним виразом, але це звучить нерозумно. Проблема з терміном C / C ++ полягає в тому, що він може означати кілька речей, тому у вас немає гарантії, що він перетворить бажане значення. У моїй практиці люди зазвичай розуміють це як "C - це лише стара примітивна версія C ++", і це просто неправильно.
мартінкунев

4
Поза внутрішньою силою термін C/C++не є чітким, а значить, не корисним. Наслідуючи ваші приклади, a C/C++ libraryможе означати бібліотеку C із обгорткою C ++, або бібліотеку C ++ із обгорткою C. Або це може означати, що бібліотека складається з декількох модулів, деякі складені за допомогою C ++, а деякі зібрані в C. Це зовсім не ясно. Мені сказати, що бібліотека створена C and C++набагато чіткіше, або C library with compatibility with C++також набагато зрозуміліша. І тут неоднозначність лише з двома мовами, уявіть, використовуючи цю "стратегію комунікації" для більше ...
робочий

43

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

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

Однак можуть бути контексти, де C / C ++ може бути відповідним.

  • Існують різні бібліотеки, які зазвичай мають як C, так і C ++ API. Я думаю, що це далеко не правда, якщо ви називаєте таку річ бібліотекою C / C ++. Ми, люди, любимо стискати інформацію, тому, кажучи, що "opencv - це бібліотека C / C ++", це коротко, зрозуміло і зрозуміло, порівняйте це з тим, що "opencv - це бібліотека, яка постачається із заголовками як для C, так і для C ++".
  • Можна говорити про мовну конструкцію та синтаксис. З точки зору синтаксису мови, ви можете сказати, що мова має синтаксис C / C ++.
  • Ви організовуєте конкурс кодування, і ви приймаєте обидва рішення, написані на C та C ++
  • Ви наймаєте нового програміста, і більшість завдань буде або C, або C ++, тому програміст повинен знати обидві мови. Це поширене вбудована розробка, де C більше підходить для деяких (як правило, дуже маленьких) мікроконтролерів, а C ++ для інших. У цьому випадку ви можете сказати, що шукаєте програміста C / C ++.

10
Я бачу, що позиції проти загального консенсусу тут на P.SO. (де ви повинні підкреслити все, що виглядає "спритним / ажіотажним", як "Єдина і унікальна правильна річ", і зняти з уваги решту) є такими ж вітальними, як зазвичай. Хлопці, програмування - це не релігія, і цей веб-сайт не є священною книгою.

16
Остання точка кулі насправді демонструє головну проблему: Ви шукаєте (1) для людини, яка знає або C, або C ++, (2) людину, яка знає і C, і C ++, або (3) особу, яка розгублена, почувши це різні мови. Не допоможіть цьому третьому басейну рости.
5gon12eder

10
Останню кульову точку краще виразити як «програміст із досвідом роботи на C та C ++», якщо це те, що ви насправді шукаєте. Об'ява про роботу під назвою "програміст", яка відповідно до досвіду, необхідного у списках "C і C ++" або "C або C ++", не суттєво відрізняється від одного під назвою "програміст" і вказує "C / C ++" як необхідну кваліфікацію, але це набагато точніше. Тип людини, яку ви шукаєте для такої роботи, цілком може оцінити цю точність вираження.
CVn

10
У письмовій мові '/' зазвичай трактується як логічне or, а не як логічне xor. Так це або одне, або і те і інше. У списках робіт ви знаєте або C, або C ++, або те і інше. Зараз я відчуваю, що багато людей релігійно ставляться до цього терміну. Хороший C програміст буде прекрасно збирання C ++ незалежно один від одного , як відрізняються обидві мови. Я почав кодувати PHP, а потім перейшов до Scala (дві абсолютно різні мови) Чому програміст C не може забрати C ++ або viceversa? Термін C / C ++ має певні заслуги, якщо він використовується в правильному контексті.
ILikeTacos

4
Ви також можете використовувати C / C ++ для опису програми, яка призначена для роботи при компіляції як C або C ++, або програми з окремими компонентами C і C ++.
іммібіс

30

Як правило, користувачі SO задають людині, яка задає питання, вибрати мову: C або C ++. Чому?

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

  • Іноді ми можемо помітити, що код недійсний на одній або іншій мові (наприклад, неявна конверсія від void*вказівника до об’єкта не вірна в C ++). Це дратує. Чому ви говорите "C / C ++", коли у вас є фрагмент коду, дійсний у C, але не C ++? Ви мали намір C, чи це просто помилка в коді, який повинен бути C ++?

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

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

У будь-якому випадку, щоб відповісти на ваші інші запитання:

  1. Так.

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

  3. Іноді відбуваються неполадки, але вони рідкісні та мають обмежений вплив (інакше їх не схвалюють). Наприклад, autoв C ++ 11.

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

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


7
Я знаю, що є люди, які пишуть код у перетині C і C ++ і використовують компілятор C ++ для перевірки типу, але компілятор C для генерації коду. Я навіть не маю уявлення, чи це насправді має сенс чи ні. Однак це тема, яка з’являється кожні пару років у розсиланному списку ядра Linux, коли хтось надсилає патч для перейменування (дуже важливо в Єдиній об'єктно-орієнтованій моделі драйверів Linux Kernel) struct classна щось подібне struct klassсаме з цієї причини, і потім Лінус незмінно збивається.
Йорг W Міттаг

3
@ JörgWMittag: Я ніколи не зустрічав нікого, хто використовував "C / C ++" як скорочення для "загального підмножини C і C ++", а також знав, про що він говорить. Люди, які навмисно працюють у загальній підмножині, прагнуть зробити це явним, не скорочуючи.
Барт ван Іґен Шенау

2
Це хороша відповідь конкретно про використання C / C ++ у питаннях обміну стеками , а не загалом.
іммібіс

@BartvanIngenSchenau Скільки членів комітету std ви зустрілися?
допитливо

18

Мені завжди говорили, що C - це підмножина C ++ або C ++ - це C з класами. І це було тихо, до появи C ++ x0, C ++ 11 (або сучасного C ++ 11/14/17 взагалі).

C ніколи не була підмножиною C ++. Наприклад, C89 не є підмножиною C ++ 98.

Кілька прикладів:

  • форма списку ідентифікаторів C89 для оголошення параметра функції не підтримується в C ++
  • C89 і C ++ 98 мають різні типи констант символів
  • C89 і C ++ 98 мають різні типи для рядкових літералів
  • логічні оператори дають різні типи в C89 і C ++ 98 ( intпроти bool)
  1. Чи варто припинити використання терміна C / C ++?

Так.

  1. Якщо відповідь на номер 1 - так, то як би я назвав програму, яка використовує суміш C і C ++?

Програма - це або C, або C ++ (якщо навіть якась основна програма може компілюватися з компілятором C або C ++). Який компілятор ви використовуєте для його складання? Це має відповісти на ваше запитання. Harbison & Steele ввели термін Clean C для позначення загального підмножини C і C ++, але я думаю, це була погана ідея.

EDIT : Однак я визнаю, що технічно ви можете зв'язати файли об'єктів C і C ++ в одній програмі, але OTH існує багато мов, дозволених для змішування в одній програмі, наприклад, Java і C ++. Я думаю, що використання програми C / C ++ лише додає плутанини, що вона написана однією мовою під назвою C / C ++.

  1. Зважаючи на те, що обидві вони є "різними" мовами, ймовірно, що в якийсь момент компілятори C ++ перестануть підтримувати код, написаний мовою С (оскільки сучасний c ++ розходяться з менталітетом C для основних елементів, таких як покажчики, динамічна обробка пам'яті тощо)

Є багато функцій (наприклад: масив змінної довжини, гнучкий член масиву,, _Generic...) C99 або C11, які не підтримуються жодною версією C ++.


Повторномовні програми: програма, що широко використовує JNI, може бути названа програмою C / Java. Те, що дві мови використовуються разом, не означає, що вони складені разом.
іммібіс

1
stroustrup.com/bs_faq.html#C-is-subset "У суворому математичному сенсі C не є підмножиною C ++ ... Однак C ++ підтримує будь-яку техніку програмування, що підтримується C ... Це не рідкість здатний конвертувати десятки тисяч ліній C у C ++ у стилі C за кілька годин. Таким чином, C ++ є стільки ж супернабором ANSI C, скільки ANSI C - це супернабір K&R C і стільки, скільки ISO C ++ - це супернабір C ++ як це існувало в 1985 році . Добре написаний C, як правило, також є легальним C ++. Наприклад, кожен приклад в Kernighan & Ritchie: "Мова програмування на C (2-е видання)" - це також програма C ++ ".
Бен

@Ben перша програма (привіт світ) у "Мові програмування на C (2-е видання)" опускає тип повернення основного, який недійсний у C ++.
оуа

1
@ouah, схоже, професор Струструп пропустив одного тоді :-) Зауважте, що це заборонено і в C11 :-) Напевно, це було дозволено і в попередніх версіях C ++.
Бен

4
@ouah, це не перша версія C ++. Книга з 1988 року, і в той час жодна мова не була стандартом ISO. Поточна версія C ++ на той час була книгою Bjarne Stroustrup 1985 року.
Бен

17

Деякі програми записані в суміші С і С ++

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

Але це лише програма в цілому. Як щодо окремих складових одиниць?

Існує підмножина C, яка також є підмножиною C ++

Програма (або підрозділ компіляції), записаний у цьому підмножині, буде компілювати та поводитись однаково у відповідних компіляторах C та C ++. Таку програму або файл по праву можна назвати "програмою C / C ++" або "файлом C / C ++".

Часткова програма, така як файл заголовка, також може використовуватися як у програмах C, так і C ++. Такі файли заголовків можна по праву називати заголовками C / C ++.

Цитуючи професора Б'ярна Струструпа:

Чи є підмножиною C ++?

У строгому математичному сенсі C не є підмножиною C ++. Є програми, які є дійсними C, але не дійсні C ++ і навіть декілька способів написання коду, який має різний зміст у C та C ++. Однак C ++ підтримує будь-яку техніку програмування, підтримувану C. Кожну програму C можна записати по суті однаково у C ++ з однаковою ефективністю виконання та простору. Не рідкість можливість за кілька годин перетворити десятки тисяч ліній ANSI C в C ++ у стилі C. Таким чином, C ++ - це стільки ж супернабір ANSI C, скільки ANSI C - це супернабір K&R C, а також ISO C ++ - це супернабір C ++, як це існувало в 1985 році.

Добре написаний C також є законним C ++. Наприклад, кожен приклад в Kernighan & Ritchie: "Мова програмування на C (2-е видання)" також є програмою C ++.

Так, так , є таке поняття, як C / C ++. Це все, що є дійсним C та дійсним C ++.

Попередній процесор C є частиною мови С. Попередній процесор C ++ є частиною мови C ++

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

Якщо програма по суті однакова, але з додатковими функціями, не зовсім неправильно сказати, що це та сама програма. Це те саме, але і різне.

Більшість програмістів на C можуть зробити хоча б трохи C ++ і навпаки

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

Немає нічого поганого в тому, щоб сказати "C / C ++". Те, що має значення, розуміється

Англійська мова не є інструментом для вираження силогізмів . Ви можете використовувати англійську мову для логіки, але лише справедливо і з великими зусиллями.

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


5
@ BЈoviћ Вони не згодні з вами щодо прийнятності невеликого термінології, тож ви зробите висновок, що вони не розуміють різниці і є некомпетентними. Це досить нерозумно сказати.
Бен

4
@ el.pescado Так. Ви побачите, що люди насправді посилаються на PHP / JavaScript. Чому ні? Сенс - розуміти, а не грати в ігри зі словами.
Бен

10
@ BЈович Ви не маєте сенсу. Вони не «зовсім інші». C ++ є набагато більшою мовою, ніж C, але вона включає майже весь C всередині неї. Є несумісності, які перешкоджають C ++ бути належним суперсетом, але вони невеликі, як додаткові зарезервовані слова, ще декілька записів стають необхідними, але це майже все. Це майже належний суперсет, просто не зовсім.
Бен

7
@ BЈовић Можливо, ти не зрозумів, що я написав. Чому б вам не заглянути сюди, щоб побачити, як у кожному випадку можна адаптувати програму C, щоб вона також компілювалася як C ++. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ BЈовић Якщо ви з великим терпінням ставитеся до термінології, ви повинні усвідомлювати, що C - це не " функціональний ", а скоріше " процедурний " - різницю, яку ви, можливо, захочете зрозуміти, перш ніж укладати звинувачення в некомпетентності інших.
РМ

15
  1. Чи варто припинити використання терміна C / C ++?

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

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

Я рекомендую замість того, щоб говорити про "C / C ++", використовувати термін, який фактично дає зрозуміти, що ви маєте на увазі.

  • Якщо ви говорите про що - то в C , що може або не може бути також вірно для C ++, просто сказати C .

    Приклад: Як слід mainоголосити функцію в C?

    Спочатку може здатися, що відповідь на C ++ однакова: int main()або int main(int, char**). Але в ході обговорення триває, може бути доречним зазначити, що в C ++ функція повинна бути оголошена в глобальному масштабі, що не має сенсу в C, оскільки у неї немає namespaces. З іншого боку, C дозволяє викликати mainрекурсивно, тоді як C ++ не робить. У C ++ є неявне, return 0;якщо ви «падаєте», mainале в C returnзаява потрібна для будь-якого шляху. Список продовжується, і це робить дискусію набагато простішою, якщо ви чітко визначите, якою є мова, яку потрібно обговорити.

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

    Приклад: Чи спочатку malloc()редактор масиву ints буде всіма нулями в C ++?

    Коротка відповідь для С буває однаковою: ні. Але, як відповідь продовжується, можливо, варто зазначити, що в C callocбуло б хорошою альтернативою, перебуваючи в C ++, використання, std::vector<int>можливо, було б кращим вибором.

  • Якщо ви хочете вказати на схожість між C і C ++, скажіть C і C ++ .

    Приклад: У C і C ++ визначається реалізація sizeofan intі може відрізнятися між компіляторами та архітектурами.

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

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

C ++ підтримує /* … */та // …коментує, тоді як C підтримує лише /* … */стиль.

не є ні правильним, ні неправильним.

  1. Якщо відповідь на номер 1 - так, то як би я назвав програму, яка використовує суміш C і C ++?

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

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

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

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

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

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

  1. Чи є зараз якась співпраця між людьми, які складають стандарти C / C ++, щоб зберегти сумісність?

Так. Модель пам'яті та бібліотека атомних операцій, введена в C ++ 11 і C11, є хорошим прикладом. Здається, що дизайнери обох мов розуміють, що сумісність важлива і працюють над її вдосконаленням. Особисто я хотів би, щоб співпраця була інтенсивнішою, а дві робочі групи ISO, можливо, навіть приєдналися, але мої побажання не важливі.

Bjarne Stroustrup розповідає про відмінності та спільність між різними версіями C і C ++ у § 44.3 4-го видання «Мова програмування C ++», який, за іронією долі, має назву «C / C ++ Compatibility». Вживання цього терміна насправді може бути доречним у цьому випадку, оскільки зрозуміло, що мається на увазі.

  1. Якщо №4 - так, така співпраця може закінчитися найближчим часом із появою сучасного C ++ (14.11.17)

Як обговорювалося вище, це сталося в C ++ 11, і, як очікується, потрібно було повторитися.


Як це не може бути ні правильним, ні неправильним?
JDługosz

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

5

C / C ++ - перетин C і C ++.

int new;не є C / C ++, і ні vector<int> foo;.

Аналогічно, C89 / C99 є перетином цих двох мов, де ні enum bool { false, true };або for(int i = 0;;)заборонено.

І C ++ 11 / C ++ 14 тощо.

Можна записати код, який компілюється (і правильно працює) під C ++ 11 і C ++ 14, навіть якщо компіляція під одним не означає, що він компілюється під іншим. Насправді багато людей це роблять.

І багато людей пишуть код, який працює на C і C ++.

Очевидно, що чим більше перекриття, тим більше сенсу це має; Я не сподіваюся побачити будь-які питання щодо C / C ++ / Java-коду.


Хоча має сенс говорити про загальний підмножині цих мов, на багато питань не буде відповідей у ​​цьому підмножині, наприклад, що має головне () повернутися в C та C ++?

Але ви можете поговорити про код, який працює для декількох мовних специфікацій, незалежно від того, чи відрізняються ці характеристики за "версією" чи "назвою мови" чи іншим чином.


3

Це своєрідна відповідь на позицію, що "це код для програмістів, які працюють близько до металу і все добре в контексті управління", видно в деяких інших відповідях та коментарях.


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

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

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

Я зараз не займаюся цим бізнесом (навіть у тій мірі, якою я був, коли Стек Переповнення був у зародковому стані), тому я не буду ризикувати, як часто будь-який уявний респондент не мав би перехресних навичок, але Я думаю, що, як найчастіше, мови зараз справді дуже різні.

Коротше кажучи, "C / C ++" слід скасувати не лише у технічних контекстах, але й у більшості бізнес-контекстів.


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

2

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

І це було тихо, до появи C ++ x0, C ++ 11 (або сучасного C ++ 11/14/17 взагалі).

C ++ 98 і 03 навіть не віддалено C із класами. Хто навчив вас цього, не знає лайна, і ви можете їх забути. Це ніколи не було правильним.


Це не зовсім вірно. Свого часу була сторінка, яка описувала запропоновану специфікацію мови для мови під назвою "C / C ++", яка, серед іншого, вказала (майже) відсутність системи типів. На жаль, сторінка з тих пір була знята, а веб-сайт, який розмістив її, з тих пір створив robots.txt, який видалив заархівовану копію з archive.org.
greyfade

1
Ага, я знайшов копію на archive.is: Обгрунтування , синтаксис та семантика .
greyfade

5
"Кожна програма є або C, або C ++." Я не погоджуюсь. Досить звичайно брати програму C і пересилати її на C ++ по одному файлу за раз (змінивши варіант компілятора для цього одного файлу). Деякі файли ніколи не можуть бути перенесені і залишатись C назавжди. Така програма написана і на C, і на C ++
nikie

Не зовсім. Ця програма складається з підпрограм, кожна з яких є або C, або C ++. Кожен TU, який є цілою програмою, що стосується компілятора, складається як C або C ++.
DeadMG

3
Це не так, що "Кожна програма є або C, або C ++". Професор Б'ярн Струструп каже: "Добре написаний C також є законним C ++. Наприклад, кожен приклад в Kernighan & Ritchie: "Мова програмування на C (2-е видання)" - це також програма C ++. " stroustrup.com/bs_faq.html#C-is-subset
Бен

1

Концептуально не повинно виникнути особливих труднощів при розробці вихідних файлів C, щоб вони також могли бути складені як є з C ++. Дійсно можуть бути певні переваги в цьому. Наприклад, при написанні коду для вбудованої системи іноді корисно мати можливість протестувати код на середовищі розміщеного ПК. Якщо код чітко компілюється як C ++, можливо, є оператор типу "MOTOR_ENABLE = 1;" записуйте на мінливий біт вводу / виводу у вбудованій системі (складений як C), але запускайте логіку емуляції на ПК (компілюючи як C ++). Можливо, також було б можливим створити тип C ++ на ПК, який би поводився так, як uint16_t поводиться на менших вбудованих системах (так що, наприклад, даний u16 x=65533;компілятор повинен був би враховувати значенняx*xяк дев'ять, а не маючи вільне правління, щоб робити все, що завгодно), хоча поки ніхто з моїх емуляторів не включив це [частково тому, що компілятори C ++, які я використовував, не зробили нічого дурного в таких випадках].

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

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


1
Що таке "C ++ 95"? Технічний звіт?
Бен Войгт

1
Якщо ви хочете перевантажувати свої внутрішні функції, але не маніпулювати імена для своїх зовнішніх, ви можете поставити перше в анонімне namespaceі оголосити останнє як extern "C", а потім скористатися компілятором C ++.
5gon12eder

@BenVoigt: Mea culpa. Я мав би це поглянути. Версія C ++ до C99. Коли C89 вийшов, він намагався зробити C схожішим на C ++, але C99 додав неабияку кількість функцій, які C ++ точно не цікавили (наприклад, масиви змінної довжини). Я не програмую багато на C ++, але думаю, що ще кілька функцій C ++ допоможуть C більше, ніж допомогли розбіжні функції.
supercat

@ 5gon12eder: Я ніколи не намагався пов'язати код C ++ у проекті C. Це насправді так просто, як мати все статичне / вбудоване, або extern "C"ж є й інші ускладнення (наприклад, ініціалізація статичних об'єктів тощо)? Чи є в C ++ спосіб зробити так, щоб foo(1234)викликати foo_const(1234)макрос, тоді як foo(x)[де xне константа] буде викликати foo_var(x)функцію? У вбудованому коді є багато ситуацій, коли може бути сенс для "функції", як, наприклад SET_PORT(port, state), три форми, засновані на тому, чи є порт, і стан обидва ...
supercat

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