Совместимость C и C++


Языки программирования C и C++ тесно связаны между собой, но имеют много существенных различий. C++ начинался как ответвление раннего, предварительно стандартизированного C и был разработан, чтобы быть в основном совместимым с компиляторами C того времени по исходникам и ссылкам. [1] [2] В связи с этим инструменты разработки для двух языков (такие как IDE и компиляторы ) часто интегрируются в один продукт, при этом программист может указать C или C++ в качестве исходного языка.

Однако C не является подмножеством C++, [3] и нетривиальные программы C не будут компилироваться как код C++ без модификации. Точно так же C++ предоставляет множество функций, недоступных в C, и на практике почти весь код, написанный на C++, не соответствует коду C. Эта статья, однако, фокусируется на различиях, которые приводят к тому, что соответствующий код C является неправильно сформированным кодом C++ или соответствует/правильно построен в обоих языках, но ведет себя по-разному в C и C++.

Бьерн Страуструп , создатель C++, предположил [4] , что несовместимость между C и C++ должна быть уменьшена настолько, насколько это возможно, чтобы максимизировать взаимодействие между двумя языками. Другие утверждали, что, поскольку C и C++ — два разных языка, совместимость между ними полезна, но не жизненно важна; согласно этому лагерю, усилия по уменьшению несовместимости не должны препятствовать попыткам улучшить каждый язык в отдельности. Официальное обоснование стандарта C 1999 г. ( C99 ) «одобряет [d] принцип сохранения наибольшего общего подмножества» между C и C ++, «при сохранении различия между ними и позволяя им развиваться отдельно», и говорится, что авторы были «довольно позволить C++ быть большим и амбициозным языком».

Некоторые дополнения C99 не поддерживаются в текущем стандарте C++ или конфликтуют с функциями C++, такими как массивы переменной длины , собственные типы комплексных чисел и restrict квалификатор типа . С другой стороны, C99 уменьшил некоторые другие несовместимости по сравнению с C89 за счет включения функций C++, таких как //комментарии и смешанные объявления и код. [6]

C++ применяет более строгие правила типизации (отсутствие неявных нарушений системы статического типа [1] ) и требования к инициализации (принудительное выполнение во время компиляции того, что переменные в области видимости не имеют нарушенной инициализации) [7] , чем C, и поэтому некоторый допустимый код C недействителен в C++. Обоснование этого приведено в Приложении C.1 стандарта ISO C++. [8]

Чтобы код скомпилировался как на C, так и на C++, необходимо использовать явное приведение типов следующим образом (с некоторыми оговорками для обоих языков [10] [11] ):