Си является одним из старейших языков, которые все еще существуют. Его ABI прост, и практически каждая операционная система, все еще используемая сегодня, была написана на нем . В то время как некоторые из этих ОС могут добавлять что-то, например, в C # / .NET или что-то еще сверху, внизу они очень сильно погружены в 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, но это только я.