Должен ли я перестать использовать термин C /C ++?

Я понимаю, что 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 ++ (11/14/17)

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

140 голосов | спросил rkachach 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 22:27:57 +0300 2015, 22:27:57

11 ответов


184

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

4) afaik no, рабочие группы знают друг о друге, но стандарты принимают оптимальные для себя решения.

/* 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.

ответил xhainingx 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 22:32:57 +0300 2015, 22:32:57
108

Там есть , чтобы быть причиной, почему эти термины объединяются так часто. Хотя вы не должны указывать своему учителю C, что его язык является подмножеством C ++, здесь есть определенная правда. Другие уже разоблачили точку зрения вашего учителя. Это очень приятно (и иллюстрируется примерами и т. Д.). Но мы не живем в башне из слоновой кости или книге.

Ваш большой босс все равно не заботится о том, какой именно язык вы использовали. Если он немного знает о программировании, просто скажите ему, что вы использовали C /C ++, и это будет звучать так: «Я использовал язык, который нужно скомпилировать для машинного кода, с DLL и всеми сложными вещами». Это часть «внешнего сообщения».

Если вы создаете библиотеку, которая может взаимодействовать как с C, так и с C ++, вы определенно хотите назвать ее библиотекой C /C ++. Конечно, кто-то поднимет руку и спросит, почему вы не называете эту библиотеку C, у которой есть C ++-оболочка, и в любом случае C ++ может ссылаться на библиотеки C, поэтому вам не нужно упоминать об этом вообще. Просто ответьте: «Да, вы правы, это библиотека C /C ++». Это часть «внутренней коммуникации».

Если вы создаете лексический анализатор для C ++, вы будете удивлены, насколько хорошо он работает с C. Вам может даже не понадобиться модифицировать все это. Это «если это похоже на утку и т. Д.» часть.

Etc.

Большинство программ на C, которые я когда-либо видел, компилируются (и работают) без изменения в качестве кода на C ++. Не позволяйте некоторым исключениям или догматическим (каким бы влиятельным) программистам не обмануть вашу интуицию. C и C ++ - это so close, и поэтому часто совместимы и поэтому часто смешиваются и сопоставляются вместе, что используется термин C /C ++. Используется потому, что полезно описывать такие ситуации, когда на самом деле неважно, рассматриваете ли вы C или C ++, если это не Java или PHP . Мы знаем, что это «неправильно», но нам все равно, это более полезно, чем неправильно.

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

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

Конкретно о ваших точках:

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

2) N /A

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

4) Не знаю

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

ответил Tibo 1 +03002015-10-01T02:03:17+03:00312015bEurope/MoscowThu, 01 Oct 2015 02:03:17 +0300 2015, 02:03:17
42

Против потока, я бы сказал, зависит от контекста .

Термин «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 ++.
ответил vsz 1 +03002015-10-01T09:15:33+03:00312015bEurope/MoscowThu, 01 Oct 2015 09:15:33 +0300 2015, 09:15:33
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 ++», я действительно не уверен, что вы имеете в виду, и похоже, что вы делаете предположение о двух языках.

ответил Brian 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 23:53:40 +0300 2015, 23:53:40
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 vs bool)
  
  1. Должен ли я перестать использовать термин C /C ++?
  2.   

Да.

  
  1. Если ответ на # 1 да, как я могу назвать программу, использующую сочетание C и C ++?
  2.   

Программа является либо C, либо C ++ (если даже какая-то очень простая программа может быть скомпилирована либо с C, либо с компилятором C ++). Какой компилятор вы используете для его компиляции? Он должен ответить на ваш вопрос. Harbison & Стил придумал термин Очистить C , чтобы обозначить общее подмножество C и C ++, но я думаю, что это была плохая идея.

EDIT . Однако я признаю, что технически вы можете связать файлы объектов C и C ++ в одной программе, но OTH есть много языков, которые могут быть смешаны в одной программе, например Java и C ++ , Я думаю, что использование термина C /C ++-программа только добавляет к путанице, что она написана на одном языке C /C ++.

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

Существует множество функций (например: массив переменной длины, гибкий член массива, _Generic, ...) C99 или C11, которые не поддерживаются ни одной версией на C ++.

ответил ouah 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 22:32:31 +0300 2015, 22:32:31
16

Некоторые программы написаны в виде комбинации 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 (второе издание)» также является программой на C ++.

Итак да есть такая вещь, как C /C ++. Это все, что является действительным C и действительным C ++.

Препроцессор C является частью языка C. Препроцессор C ++ является частью языка C ++

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

Если программа по существу то же самое, но с дополнительными функциями, это не совсем wrong , чтобы сказать, что это одна и та же программа. Это то же самое, но и другое.

Большинство программистов на C могут делать хотя бы немного C ++ и наоборот

Неразумно называть такого человека программистом на C /C ++. Да, они, вероятно, специализируются на одном, но есть ли кто-нибудь, кто является компетентным программистом на C или C ++, который буквально не может выполнять любой другого языка? В некотором смысле, не являются ли они all программистами на C /C ++?

Нет ничего плохого в высказывании «C /C ++». Важно понимать, что

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

Это потому, что слова, естественно, не имеют точных значений, а скорее смутное облако обозначений и коннотаций. Важно то, что люди понимают, что вы говорите.

ответил Ben 1 +03002015-10-01T13:07:53+03:00312015bEurope/MoscowThu, 01 Oct 2015 13:07:53 +0300 2015, 13:07:53
15
  
  1. Должен ли я перестать использовать термин C /C ++?
  2.   

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

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

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

  • Если вы говорите о чем-то в C, который может или не может быть истинным для C ++, просто скажите C .

      

    Пример: Как должна быть объявлена ​​функция main в C?

         

    Во-первых, может показаться, что ответ для C ++ тот же: int main() или int main(int, char**). Но по мере продолжения обсуждения может быть уместным отметить, что в C ++ функция должна быть объявлена ​​в глобальной области, что не имеет смысла в C, поскольку в ней нет пространства имен namespace s , С другой стороны, C позволяет вызывать main рекурсивно, а C ++ - нет. В C ++ существует неявный return 0;, если вы «не вошли» main, но в C требуется инструкция return на любом пути , Список можно продолжить, и это значительно упростит обсуждение, если вы разъясните, на каком языке будет обсуждаться.

  • Если вы говорите о чем-то в C ++, который может или не может быть истинным для C, просто скажите C ++ .

      

    Пример: Будет ли исходный массив malloc() из int s быть все-нулями в C ++?

         

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

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

      

    Пример: В C и C ++ значение sizeof a int определяется реализацией и может варьироваться между компиляторами и архитектурами.

         

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

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

  

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

не является ни правильным, ни неправильным.

  
  1. Если ответ на # 1 да, как я могу назвать программу, использующую сочетание C и C ++?
  2.   

Так как языки перекрываются, каждая программа C будет содержать parts , которая может выглядеть как C ++ и наоборот. Тем не менее, авторы, вероятно, решили бы использовать либо C, либо компилятор C ++. Так скажите «программа написана в C , если она скомпилирована с компилятором C и« программа написана на C ++ », если они используют C ++ компилятора, даже если они могут отказаться от использования каких-либо современных возможностей C ++. Некоторые люди ссылаются на такой код на C ++ как C-style C ++ . Отсутствие перегрузки, исключений, полиморфизма, шаблонов и потоков ввода-вывода - общие характеристики такого кода.

Если вместо этого некоторые файлы записаны на C и скомпилированы с компилятором C, а некоторые другие файлы записаны на C ++ и скомпилированы с помощью компилятора C ++, а затем связанные с ним файлы объектов, I скажем, что «программа написана в в сочетании с C и C ++ ), поскольку, на самом деле, вы уже это сделали.

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

Последнее часто бывает для файлов заголовков, которые должны использоваться совместно с кодом C и C ++. Кстати, писать такой код непросто. Если вы хотите еще раз подчеркнуть, что были использованы только такие конструкции, которые действительны в C и C ++ и , широко поддерживаются разными поставщиками компиляторов, термин a переносной общий Подмножество C и C ++ может использоваться для подчеркивания этого.

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

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

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

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

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

  
  1. Если # 4 да, такое сотрудничество может закончиться в ближайшем будущем появлением современного C ++ (11/14/17)
  2.   

Как обсуждалось выше, это произошло в C ++ 11 и ожидается /надеется /необходимо повторить.

ответил 5gon12eder 1 +03002015-10-01T02:24:57+03:00312015bEurope/MoscowThu, 01 Oct 2015 02:24:57 +0300 2015, 02:24:57
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 ++?

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

ответил Paul Draper 1 +03002015-10-01T19:30:33+03:00312015bEurope/MoscowThu, 01 Oct 2015 19:30:33 +0300 2015, 19:30:33
3

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


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

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

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

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

Короче говоря, «C /C ++» следует отбрасывать не только в технических контекстах, но и в большинстве бизнес-контекстов.

ответил dmckee 5 +03002015-10-05T00:06:53+03:00312015bEurope/MoscowMon, 05 Oct 2015 00:06:53 +0300 2015, 00:06:53
2

Самый простой ответ на этот вопрос: вы должны never использовать этот термин. Это термин, который не должен существовать. Это не имеет никакого значения. Каждая программа является либо C, либо C ++.

  

И это было тихо, до появления C ++ x0, C ++ 11 (или   современный C ++ 11/14/17 в целом).

C ++ 98 и 03 даже не удалены C с классами. Тот, кто вас учил, не знает дерьма, и вы можете их забыть. Это никогда не было правильным.

ответил DeadMG 1 +03002015-10-01T00:44:37+03:00312015bEurope/MoscowThu, 01 Oct 2015 00:44:37 +0300 2015, 00:44:37
1

Концептуально, не должно быть особых трудностей при разработке исходных файлов C, чтобы они также могли быть скомпилированы как есть с C ++. Для этого действительно могут быть некоторые существенные преимущества. Например, при написании кода для встроенной системы иногда бывает полезно проверить код на размещенной среде ПК. Если код компилируется чисто как C ++, возможно иметь оператор типа «MOTOR_ENABLE = 1;» пишите в энергозависимый бит ввода-вывода во встроенной системе (скомпилирован как C), но запускайте логику эмуляции на ПК (компилируя как C ++). Вероятно, также возможно создать на ПК тип C ++, который будет вести себя так, как uint16_t ведет себя на небольших встроенных системах (так что, например, заданный u16 x=65533;), компилятор должен был бы учитывать значение x*x как девятое, вместо того, чтобы иметь свободное владение делать все, что он хочет), хотя пока что ни один из моих эмуляторов не включил это [частично из-за того, что компиляторы C ++, которые я использовал haven В таких случаях не делалось ничего глупого.

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

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

ответил supercat 2 +03002015-10-02T02:27:14+03:00312015bEurope/MoscowFri, 02 Oct 2015 02:27:14 +0300 2015, 02:27:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132