Що означає відкрити код C ++ публічно як API API та які переваги цього робити?


25

Я часто чую, як люди говорять, що програмісти на C ++ повинні виставляти публічний API своєї бібліотеки / продукту як API API.

Що це означає і які переваги від цього?

Відповіді:


44

Це означає, що частина вашої бібліотеки, яка експонується як інтерфейс, використовує лише C "частину" мови, тому ви не експортуєте класи чи подібні, лише функції, POD і структури, що містять POD. Крім того, ви повинні відключити керування іменем C ++, зазвичай це досягається шляхом позначення функцій як extern "C". Типовим прикладом може бути:

extern "C" void foo(int bar);

Велика перевага експонування ваших бібліотек таким чином, що майже кожна мова програмування має механізм прямого взаємодії з бібліотекою С, але лише дуже мало хто може також безпосередньо взаємодіяти з бібліотекою С ++. Тож у цьому сенсі ви шукаєте найменший загальний знаменник, щоб полегшити іншим людям використання вашої бібліотеки.

Однак майте на увазі, що це дійсно лише корисна стратегія, якщо ви створюєте бібліотеку для споживання іншими людьми. Якщо ви створюєте частину C ++ - лише програмного забезпечення, а бібліотекам потрібно взаємодіяти між собою, вам (IMHO) краще відкривати належні API C ++, щоб ви могли використовувати всю потужність мови.


14
Ви повинні бути обережними, щоб не експортувати викинуті винятки!
Джеймс

Це чудова відповідь. Чи можете ви надати мені приклад того extern "C", чого я не отримав?
Даніель Рібейро

1
@DanielRibeiro: просто google для "зовнішнього C". Ви знайдете такі посилання: stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, доданий дуже простий приклад.
Тимо Геуш

1
@DanielRibeiro Технічно можливо все-таки використовувати .hpp, але це розширення означає "файл заголовка C ++", так і має бути .h, який використовується як для C, так і для C ++.
leemes

8

На додаток до відповіді Тимо - для деяких платформ немає стандартизованого C ++ ABI (наприклад, Windows - таких, як Linux Mac OS X, широко прийнятих), тому це не лише питання про відсутність функції, але неможливість реалізації такої функції.

Наприклад, IIRC MSVC мають різні ABI у кожній версії, і це може змінюватися залежно від того, чи це налагодження чи збірка версії - і він не публікується, тому сторонні компілятори зазвичай не сумісні (я читаю деяку інформацію про те, що деяка версія icc сумісна з MSVC 2005, але це може бути інформація, розкрита в NDA - не потрібна для творців, скажімо, Python) та використовувати їх власний ABI. Тож на практиці мовне середовище обмежує не лише версію компілятора, але й прапори.

Нарешті, у C ++ є набагато більше можливостей компіляції. Наприклад, дженерики зазвичай не існує в динамічно набраних мовах тощо.


2
@DanielRibeiro: Ласкаво просимо у чудове пекло C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). Коротка версія полягає в тому, що дуже складно змусити компоненти C ++, складені окремо (зібрані з різними компіляторами / прапорами), щоб працювати разом, а не мовчки виходити з ладу / збиватися.
Мацей П'єхотка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.