C и C++: межъязыковые интерфейсы

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

межъязыковые интерфейсы

Правда, есть одна сфера, где обычно наблюдается согласие между C и C++. Это — ABI (Application Binary Interface, двоичный интерфейс приложений). Структуры данных и функции одного языка могут быть, в той или иной мере, использованы в другом языке. C и C++, кроме того, достаточно сильно пересекаются в области спецификаций интерфейсов, вследствие чего один и тот же заголовочный файл можно использовать из кода, написанного на обоих языках.

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

Типы данных

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

Целочисленные типы — такие, как char, short, int, long в обоих языках имеют схожие представление и семантику. Но нужно знать о том, что у типа bool (или _Bool) и у перечислений есть некоторые особенности, о которых мы поговорим ниже.

Все типы для чисел с плавающей запятой имеют одно и то же представление. При работе с ними используется одинаковый синтаксис. Это — float, double, и, возможно, long double. Но синтаксис комплексных типов в C и C++ различается. В C имеется нечто вроде спецификатора, указывающего на реальный базовый тип, а в C++ для описания таких типов используются шаблоны.

Массивы имеют одинаковый синтаксис и представление. Но C позволяет менять размер массива, давая возможность работать с так называемыми массивами переменной длины (Variable Length Arrays, VLA).

Типы struct и union, если в них не объявляются члены-функции, имеют одно и то же представление. В C++ их называют простыми структурами данных (Plain Old Data structures, POD).

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

популярные языки программирования

Логический тип данных

Логический тип данных в C «официально» называется _Bool, но существует удобный макрос, в котором объявлено ключевое слово bool, указывающее на этот тип. На самом деле, эта конструкция была создана только для обеспечения обратной совместимости с кодом, который был написан до введения логического типа. Её вполне могут убрать из будущих версий стандарта C. В C++ в использовании _Bool особого смысла нет, выглядит эта конструкция нехорошо и представляет собой введение в C++-код возможности C, которая является временной (хотя в таком статусе она уже пребывает очень и очень долго).

Поэтому легче всего для организации работы с логическими значениями просто пользоваться bool и при этом обращать внимание на то, чтобы C видел бы соответствующий заголовочный файл. Сделать это несложно:

Как уже было сказано, подключать этот заголовочный файл в C++ не имеет никакого смысла.

Перечисления

Простые перечисления должны обрабатываться в C и C++ одинаково. Константы перечисления имеют одинаковые значения, но разные типы. В C это — тип int, в C++ — это тип самого перечисления.

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

По материалам сайта habr.com



Прокомментировать эту статью:


Пожалуйста, зарегистрируйтесь для комментирования.