C - одна з найдавніших мов, яка все ще існує. Його ABI простий, і практично кожна операційна система, яка досі використовується сьогодні, була написана в ньому . Хоча деякі з цих ОС, можливо, додавали речі, наприклад, у C # /. NET або будь-що інше, внизу вони дуже сильно пронизані C.
Це означає , що для того, щоб використовувати функціональні можливості, що надаються операційною системою, практично кожна мова програмування там потрібен спосіб взаємодії з бібліотеками C в будь-якому випадку . Perl, Java, C ++, всі вони споконвічно пропонують способи "розмовляти з C", тому що їм довелося, якщо вони не хотіли винаходити кожне окреме колесо, що є.
Це робить C латинією мов програмування. (Скільки років Інтернету перед цією метафорою має бути "англійською мовами, що розмовляють"?)
Коли ви пишете свою бібліотеку на мові C, ви отримуєте C-сумісний інтерфейс безкоштовно (очевидно). Якщо ви пишете свою бібліотеку на мові C ++, ви можете отримати прив’язки до C за допомогою extern "C"
декларацій, як ви згадували.
Тим НЕ менше , ви можете отримати ці прив'язки тільки для функціональності , які можуть бути виражені в C .
Таким чином, ваш API бібліотеки не може використовувати ...
- шаблони,
- класи,
- винятки,
- будь-які функції, що приймають або повертають об'єкти.
Один простий приклад, вам потрібно зробити так, щоб експортовані функції брали і повертали масиви ( []
) замість std::vector
(або std::string
з цього приводу).
Таким чином, ви не тільки не зможете надати будь-які добрі речі, які C ++ може запропонувати клієнтам вашої бібліотеки, а також доведеться докласти додаткових зусиль, щоб "перевести" API своєї бібліотеки з C ++ на "C сумісний" ( extern "C"
).
Ось чому можна сказати, що C - кращий вибір для впровадження бібліотеки. Особисто я думаю, що переваги C ++ все ще переважають необхідні зусилля для extern "C"
API, але це тільки я.