Почему С++ совместим с C?

Прочитав количество статей и руководств по С++, я часто вижу фразу "С++ не C!" или какой-то вариант. Если это так, почему С++ пытается быть совместимым с C? Наверняка это просто побуждает программистов C писать плохой код на С++? Я только новичок в этой области, поэтому не стесняйтесь бомбардировать меня причинами, по которым я ошибаюсь, думая, что С++ должен просто задуматься и забыть C. Ell.

Ответ 1

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

Периферийные цели:

  • Используйте навыки C, которые есть у многих программистов (учитывая, что он по-прежнему является одним из наиболее широко используемых языков в мире).
  • Поощряйте использование С++ как лучшего C, для: a) облегчения перехода на С++ и b) улучшения методов C-кодирования для программистов, которые не собираются переходить на С++.

Ответ 2

Вы можете прочитать историческую перспективу от самого человека здесь.

Должен ли С++ забыть C? В каком-то смысле он уже имеет, развитие двух языков развивается независимо друг от друга.

Ответ 3

С++ начался как "C с классами", и это был просто прекомпилятор, который преобразовал class и co. синтаксический сахар в C-код (C был выбран потому, что он был широко распространен, компилятор C был доступен для многих платформ); это была одна из причин, по которой он был (является) C-совместимым. Другой (и, возможно, более важный) должен был оставаться совместимым с существующей кодовой базой C (библиотеки, syscall,...), что было значительным преимуществом для его широкого использования.

Однако, во время его эволюции и стандартизации, С++ развивался в чем-то совершенно другом.

Все новые функции, которые были упакованы в него (особенно расширенные возможности OOP, исключения, шаблоны) и эволюция его стандартной библиотеки (особенно включение в нее STL), способствовали новым стилям программирования, которые значительно отличаются от старых Стиль "C с классами"; многие общие C-идиомы стали устаревшими и имели лучшие замены в С++ (см., например, std::string vs строки стиля C, std::vector и "обычные" массивы, выделенные кучей). Тем не менее, было бы неплохо удалить "старые" функции, поскольку (1) совместимость C по-прежнему важна во многих случаях, (2) "старый" материал является основой для структур данных С++ (std::vector внутренне использует необработанные указатели и массивы массивов кучи) и (3) фоновая философия С++ позволяет программисту выбирать.

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

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

Ответ 4

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