Я часто чую, як люди говорять, що програмісти на C ++ повинні виставляти публічний API своєї бібліотеки / продукту як API API.
Що це означає і які переваги від цього?
Я часто чую, як люди говорять, що програмісти на C ++ повинні виставляти публічний API своєї бібліотеки / продукту як API API.
Що це означає і які переваги від цього?
Відповіді:
Це означає, що частина вашої бібліотеки, яка експонується як інтерфейс, використовує лише C "частину" мови, тому ви не експортуєте класи чи подібні, лише функції, POD і структури, що містять POD. Крім того, ви повинні відключити керування іменем C ++, зазвичай це досягається шляхом позначення функцій як extern "C"
. Типовим прикладом може бути:
extern "C" void foo(int bar);
Велика перевага експонування ваших бібліотек таким чином, що майже кожна мова програмування має механізм прямого взаємодії з бібліотекою С, але лише дуже мало хто може також безпосередньо взаємодіяти з бібліотекою С ++. Тож у цьому сенсі ви шукаєте найменший загальний знаменник, щоб полегшити іншим людям використання вашої бібліотеки.
Однак майте на увазі, що це дійсно лише корисна стратегія, якщо ви створюєте бібліотеку для споживання іншими людьми. Якщо ви створюєте частину C ++ - лише програмного забезпечення, а бібліотекам потрібно взаємодіяти між собою, вам (IMHO) краще відкривати належні API C ++, щоб ви могли використовувати всю потужність мови.
extern "C"
, чого я не отримав?
.hpp
, але це розширення означає "файл заголовка C ++", так і має бути .h
, який використовується як для C, так і для C ++.
На додаток до відповіді Тимо - для деяких платформ немає стандартизованого C ++ ABI (наприклад, Windows - таких, як Linux Mac OS X, широко прийнятих), тому це не лише питання про відсутність функції, але неможливість реалізації такої функції.
Наприклад, IIRC MSVC мають різні ABI у кожній версії, і це може змінюватися залежно від того, чи це налагодження чи збірка версії - і він не публікується, тому сторонні компілятори зазвичай не сумісні (я читаю деяку інформацію про те, що деяка версія icc сумісна з MSVC 2005, але це може бути інформація, розкрита в NDA - не потрібна для творців, скажімо, Python) та використовувати їх власний ABI. Тож на практиці мовне середовище обмежує не лише версію компілятора, але й прапори.
Нарешті, у C ++ є набагато більше можливостей компіляції. Наприклад, дженерики зазвичай не існує в динамічно набраних мовах тощо.