- Должен ли я прекратить использование термина C / C ++?
Абсолютно. Не ясно, что эта конструкция предназначена для выражения, за исключением, возможно, путаницы в том, что 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()
массив ed int
изначально иметь все нули в C ++?
Краткий ответ для C такой же: нет. Но так как ответ продолжается, возможно, стоит отметить, что в C calloc
будет хорошей альтернативой, в то время как в C ++, std::vector<int>
возможно , использование могло бы быть лучшим выбором.
Если вы хотите указать на сходство между C и C ++, скажем, C и C ++ .
Пример: В C и C ++, то является реализация определена и может варьироваться между составителями и архитектурами.sizeof
int
Здесь мы хотим указать, что C и C ++ ведут себя одинаково. Мы явно говорим об обоих языках.
Я на самом деле рекомендую вам быть более конкретным и говорить не только о «C» или «C ++», но и о точной версии. Оба языка развиваются и тупое утверждение, такое как
C ++ поддерживает /* … */
и // …
комментирует, а C поддерживает только /* … */
стиль.
не правильно и не неправильно.
- Если ответ на вопрос № 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 ++ может быть использовано , чтобы подчеркнуть это.
- Учитывая, что оба они «разные» языки, возможно ли, что в какой-то момент компиляторы C ++ перестанут поддерживать код, написанный на языке C (поскольку современный C ++ расходится с менталитетом C для базовых вещей, таких как указатели, обработка динамической памяти и т. Д.)?
Я не уверен, что понимаю этот вопрос. Поскольку C и C ++ - это разные языки, вы не можете ожидать, что компилятор для одного из них примет программу, написанную для другого. Тем не менее, компиляторы часто проектируются модульно, и если у компилятора есть интерфейс на языке C ++ , есть хорошие шансы, что он также будет иметь интерфейс на языке Си. (Затем вы должны выбрать, какой из них вы хотите, с помощью переключателя командной строки или аналогичных средств.) Пока оба языка будут широко использоваться, кажется маловероятным, что это изменится. Ваше мнение о «современном C ++», я думаю, в основном связано с хорошими стандартами кодирования и стандартной библиотекой. С точки зрения компилятора , эволюция обоих языков скорее сходится, чем расходится.
- Есть ли сейчас какое-либо сотрудничество между людьми, которые разрабатывают стандарты C / C ++ для обеспечения совместимости?
Да. Модель памяти и библиотека атомарных операций, представленные в C ++ 11 и C11, являются хорошим примером. Кажется, что разработчики обоих языков осознают важность совместимости и работают над ее улучшением. Лично я хотел бы, чтобы сотрудничество было более интенсивным, и две рабочие группы ИСО, возможно, даже объединились, но мои пожелания не важны.
Бьярн Страуструп говорит о различиях и общности между различными версиями C и C ++ в § 44.3 4-го издания языка программирования C ++, который, по иронии судьбы, называется «Совместимость с C / C ++». Использование термина может быть действительно уместным в этом случае, поскольку ясно, что имеется в виду.
- Если № 4 - да, такое сотрудничество может закончиться в ближайшем будущем с появлением современного C ++ (14.11.17)
Как уже говорилось выше, это произошло в C ++ 11 и, как ожидается, должно произойти снова.