Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

C++ ↔ C

АспектCC++
ПерегрузкаВручную / ad hocАвтоматически
Исключения-Раскрутка стека
ДеструкторыРучная очисткаАвтоматически через деструкторы (RAII)
Типы, не являющиеся POD-Объекты с конструкторами, vtable, виртуальными базами
Шаблоны-Генерация кода на этапе компиляции

В C++ есть ряд возможностей, которых нет в C и которые влияют на FFI:

Перегрузка: перегрузки становятся невыразимыми из-за искажения имён (name mangling)

Исключения: их нужно перехватывать на границе FFI и преобразовывать в коды ошибок, поскольку исключение, вырвавшееся из функции extern "C", — неопределённое поведение

Деструкторы: вызывающий код на C не будет запускать деструкторы; нужно открыть явные функции *_destroy()

Типы, не являющиеся POD: через границу FFI нужно передавать непрозрачные указатели, поскольку передача по значению здесь не имеет смысла

Шаблоны: напрямую открыть нельзя; нужно явно инстанцировать и обернуть каждую специализацию