Должен ли я прекратить использование термина 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 ++ расходится с менталитетом 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) На самом деле, рабочие группы знают друг о друге, но стандарты принимают решения, которые лучше для них самих.

/* 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 был специально разработан, чтобы быть строгим надмножеством C, без конфликтующего синтаксиса и полностью ортогональной объектной системы. Это доведено до такой степени, что вы можете взять часть «Objective» из «Objective-C» и привязать ее к другим языкам, создав, например, Objective-MODULA-2. И самое известное, Apple Objective-C ++, которая имеет две полностью ортогональные, не взаимодействующие, неинтегрированные объектные системы.
Йорг Миттаг,

20
@masonwheeler, если OP хочет увидеть, как выглядит фактический суперсет С.
xhainingx

26
«Исходный файл написан на одном языке или другом». Расскажите об этом моей программе, которая безошибочно компилирует как стандартные C99, так и C ++ 89. Ни один из языков не является подмножеством другого, но есть пересечение их двух наборов, которое широко предназначено. Смотри Lua et al.
Великолепно

28
@muntiful, я могу написать код на C ++, который javacтоже может работать , но какой в ​​этом смысл?
xhainingx

22
@munificent Примером программы, которая может быть скомпилирована на трех языках - 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 ++. Он используется потому, что он полезен для описания подобных ситуаций, когда не имеет значения, рассматриваете ли вы C или C ++, если это не Java или PHP . Мы знаем, что это «неправильно», но нам все равно, это более полезно, чем неправильно.

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

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

Чтобы быть конкретным о ваших точках:

1) Это зависит Да, когда это может привести к путанице, когда вы чувствуете себя неловко, или когда это просто неправильно или выходит из контекста. Нет, когда вы думаете, что это адекватно.

2) Н / Д

3) Думаю нет, но у меня нет хрустального шара.

4) понятия не имею

5) Я так не думаю, потому что в этом направлении ничто не подталкивает


7
Комментарии удалены, поскольку они становились шумными.
ChrisF

3
Почему так много голосов? Он полон неточностей и ложных утверждений!
Зайбис

5
@Zaibis, будь добр, расскажи, какие претензии являются ложными или неточными?
номер пользователя

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 ++ может быть подходящим.

  • Существуют различные библиотеки, которые обычно имеют API C и C ++. Я думаю, это не так уж далеко от истины, если вы называете это библиотекой C / C ++. Нам, людям, нравится сжимать информацию, поэтому выражение «opencv - это библиотека C / C ++» является коротким, ясным и понятным, сравнивайте его со словами «opencv - это библиотека, которая поставляется с заголовками как для C, так и для C ++».
  • Вы можете говорить о дизайне языка и синтаксисе. С точки зрения синтаксиса языка можно сказать, что язык имеет C / C ++ -подобный синтаксис.
  • Вы организуете конкурс по программированию и принимаете оба решения, написанные на C и C ++
  • Вы нанимаете нового программиста, и большинство задач будет выполняться на C или C ++, поэтому программист должен знать оба языка. Это распространено во встроенной разработке, где C больше подходит для одних (обычно очень маленьких) микроконтроллеров, а C ++ - для других. В этом случае вы можете сказать, что ищете программиста на C / C ++.

10
Я вижу, что позиции против общего консенсуса здесь на P.SO. (где вы должны высказывать все, что выглядит «проворным / шумихой», как «Единый и уникальный правый смысл», а остальные - отрицательным), приветствуются как обычно. Ребята, программирование не религия, и этот веб-сайт не является священной книгой.

16
Последний пункт пули на самом деле демонстрирует главную проблему: Вы ищете (1) для человека , который knowns либо 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 ++ или наоборот? Термин C / C ++ имеет некоторые преимущества, если он используется в правильном контексте.
ILikeTacos

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

30

В общем, пользователи SO просят человека, который задает вопрос, выбрать язык: C или C ++. Почему?

Есть много тонких различий между C и C ++. Например, в C ++ constпеременная в глобальной области имеет внутреннюю связь, если она не объявлена extern, но в C она имеет внешнюю связь, если она не объявлена static. Говоря «C / C ++», OP утверждает, что ответ на их вопрос одинаков как в 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) struct classчего-то подобного struct klassименно по этой причине, и затем неизменно сбивается Линусом.
Йорг Миттаг,

3
@ JörgWMittag: Я никогда не встречал никого, кто бы использовал «C / C ++» в качестве сокращения для «общего подмножества C и C ++», а также знал, о чем он говорит. Люди, которые намеренно работают в общем подмножестве, имеют тенденцию делать это явным, не сокращая.
Барт ван Инген Шенау

2
Это хороший ответ конкретно об использовании C / C ++ в вопросах Stack Exchange , а не в целом.
immibis

@BartvanIngenSchenau Сколько членов комитета вы встречали?
любопытный парень

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 ++, но я думаю, что это была плохая идея.

РЕДАКТИРОВАТЬ : Тем не менее, я допускаю, что технически вы можете связать файлы объектов C и C ++ в одной программе, но OTH есть много языков, которые разрешено смешивать в одной программе, например, Java и C ++. Я думаю, что использование термина C / C ++ программа только добавляет путаницы, что она написана на одном языке, называемом C / C ++.

  1. Учитывая, что оба они «разные» языки, вполне вероятно, что в какой-то момент компиляторы C ++ перестанут поддерживать код, написанный на языке 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 ++ ».
Бен

@ В первой программе (hello world) на «Языке программирования C (2-е издание)» опущен возвращаемый тип main, который недопустим в C ++.
ouah

1
@ouah, похоже, профессор Страуструп тогда пропустил :-) Обратите внимание, что это не разрешено и в C11 :-) Хотя я уверен, что это было разрешено в более ранних версиях C ++.
Бен

4
@ouah, это не первая версия C ++. Книга написана в 1988 году, и в то время ни один из языков не был стандартом ISO. Текущей версией C ++ в то время была книга Бьярна Страуструпа 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 ++ поддерживает все методы программирования, поддерживаемые 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Јовић Они не согласны с вами по поводу приемлемости небольшой части терминологии, поэтому вы пришли к выводу, что они не понимают разницы и некомпетентны. Это довольно неразумная вещь, чтобы сказать.
Бен

4
@ el.pescado Да. Вы обнаружите, что люди действительно ссылаются на PHP / JavaScript. Почему нет? Суть в том, что нужно понимать, а не играть в игры со словами.
Бен

10
@ BЈовић Ты не имеешь смысла. Они не "абсолютно разные". C ++ является гораздо большим языком, чем C, но он включает в себя почти весь C. Существуют несовместимости, которые препятствуют тому, чтобы C ++ был надлежащим надмножеством, но они маленькие, как дополнительные зарезервированные слова, требуется еще несколько приведений, но это в значительной степени так. Это почти правильный суперсет, просто не совсем.
Бен

7
@ BЈовић Возможно, ты не понял, что я написал. Почему бы вам не посмотреть здесь, чтобы увидеть, как в каждом случае можно адаптировать программу на C, чтобы она также компилировалась как C ++. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Бен

7
@ BЈовић Если вы склонны к педантичности в отношении терминологии, вы должны знать, что C не « функциональный », а скорее « процедурный » - различие, которое вы, возможно, захотите понять, прежде чем бросать обвинения в некомпетентность другим.
RM

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()массив ed intизначально иметь все нули в C ++?

    Краткий ответ для C такой же: нет. Но так как ответ продолжается, возможно, стоит отметить, что в C callocбудет хорошей альтернативой, в то время как в C ++, std::vector<int>возможно , использование могло бы быть лучшим выбором.

  • Если вы хотите указать на сходство между C и C ++, скажем, C и C ++ .

    Пример: В C и C ++, то является реализация определена и может варьироваться между составителями и архитектурами.sizeofint

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

Я на самом деле рекомендую вам быть более конкретным и говорить не только о «C» или «C ++», но и о точной версии. Оба языка развиваются и тупое утверждение, такое как

C ++ поддерживает /* … */и // …комментирует, а C поддерживает только /* … */стиль.

не правильно и не неправильно.

  1. Если ответ на вопрос № 1 - да, как бы я назвал программу, которая использует смесь 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 ++ и широко поддерживаются различными поставщиками компиляторов, термин портативного общее подмножество C и C ++ может быть использовано , чтобы подчеркнуть это.

  1. Учитывая, что оба они «разные» языки, возможно ли, что в какой-то момент компиляторы C ++ перестанут поддерживать код, написанный на языке C (поскольку современный C ++ расходится с менталитетом C для базовых вещей, таких как указатели, обработка динамической памяти и т. Д.)?

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

  1. Есть ли сейчас какое-либо сотрудничество между людьми, которые разрабатывают стандарты C / C ++ для обеспечения совместимости?

Да. Модель памяти и библиотека атомарных операций, представленные в C ++ 11 и C11, являются хорошим примером. Кажется, что разработчики обоих языков осознают важность совместимости и работают над ее улучшением. Лично я хотел бы, чтобы сотрудничество было более интенсивным, и две рабочие группы ИСО, возможно, даже объединились, но мои пожелания не важны.

Бьярн Страуструп говорит о различиях и общности между различными версиями C и C ++ в § 44.3 4-го издания языка программирования C ++, который, по иронии судьбы, называется «Совместимость с C / C ++». Использование термина может быть действительно уместным в этом случае, поскольку ясно, что имеется в виду.

  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.


Хотя имеет смысл говорить об общем подмножестве этих языков, многие вопросы не будут иметь ответов в этом подмножестве, например, что должен вернуть main () в C и C ++?

Но вы можете говорить о коде, который работает для нескольких языковых спецификаций, независимо от того, различаются ли эти спецификации по «версии» или «названию языка» или иным образом.


3

Это своего рода ответ на позицию, что «это код для программистов, которые работают близко к железу и в контексте управления работают нормально», что можно увидеть в некоторых других ответах и ​​комментариях.


Я бы сказал, что даже к этой интерпретации следует относиться с осторожностью.

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

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

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

Короче говоря, 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 ++ (например, возможность перегружать функции статической или статической встроенной связью, не принимая на себя затраты, связанные с другими функциями, которые не нужны (например, искажение имени, связанное с экспортом). перегруженные функции).

Хотя пересечение C89 и C ++ 98 является работоспособным языком, полезный надмножество более поздних версий C с более поздними версиями C ++, вероятно, сократился, а не вырос (благодаря таким вещам, как правило строгого псевдонима), и тенденции благоприятствуют растущая трещина.


1
Что такое "C ++ 95"? Технический отчет?
Бен Фойгт

1
Если вы хотите перегрузить свои внутренние функции, но не хотите искажать имена для своих внешних, вы можете поместить первое в анонимное namespaceи объявить второе как extern "C", а затем использовать компилятор C ++.
5gon12eder

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

@ 5gon12eder: я никогда не пытался связать код C ++ с проектом C. Действительно ли это так просто, как иметь все или быть статическим / встроенным, или extern "C"же есть и другие сложности (например, инициализация статического объекта и т. Д.)? Есть ли способ в C ++ сделать так, чтобы foo(1234)он вызывал foo_const(1234)макрос, в то время как foo(x)[где xнет константы] будет вызывать foo_var(x)функцию? Во встроенном коде есть много ситуаций, когда для «функции» может иметь смысл SET_PORT(port, state)иметь три формы в зависимости от того, являются ли порт и состояние обоими ...
supercat

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