C++ ↔ C
| Аспект | C | C++ |
|---|---|---|
| Перегрузка | Вручную / ad hoc | Автоматически |
| Исключения | - | Раскрутка стека |
| Деструкторы | Ручная очистка | Автоматически через деструкторы (RAII) |
| Типы, не являющиеся POD | - | Объекты с конструкторами, vtable, виртуальными базами |
| Шаблоны | - | Генерация кода на этапе компиляции |
В C++ есть ряд возможностей, которых нет в C и которые влияют на FFI:
Перегрузка: перегрузки становятся невыразимыми из-за искажения имён (name mangling)
Исключения: их нужно перехватывать на границе FFI и преобразовывать в коды ошибок, поскольку исключение, вырвавшееся из функции extern "C", — неопределённое поведение
Деструкторы: вызывающий код на C не будет запускать деструкторы; нужно открыть явные функции *_destroy()
Типы, не являющиеся POD: через границу FFI нужно передавать непрозрачные указатели, поскольку передача по значению здесь не имеет смысла
Шаблоны: напрямую открыть нельзя; нужно явно инстанцировать и обернуть каждую специализацию