Я часто слышу, как люди говорят, что программисты на C ++ должны представлять открытый API своей библиотеки / продукта как C API.
Что это значит и каковы преимущества этого?
Это означает, что часть вашей библиотеки, которая отображается как интерфейс, использует только «часть» языка C, поэтому вы не экспортируете классы или аналогичные элементы, а только функции, POD и структуры, содержащие POD. Кроме того, вы должны отключить искажение имен в C ++, обычно это достигается путем пометки функций как extern "C"
. Типичным примером будет:
extern "C" void foo(int bar);
Большое преимущество демонстрации ваших библиотек таким образом состоит в том, что почти каждый язык программирования имеет механизм прямого взаимодействия с библиотекой C, но лишь очень немногие могут напрямую взаимодействовать с библиотекой C ++. Таким образом, в этом смысле вы выбираете наименьший общий знаменатель, чтобы другим людям было проще использовать вашу библиотеку.
Однако имейте в виду, что это действительно только полезная стратегия, если вы создаете библиотеку для использования другими людьми. Если вы создаете часть программного обеспечения, предназначенного только для C ++, и библиотекам нужно только взаимодействовать друг с другом, вам (ИМХО) лучше показывать надлежащие API C ++, чтобы вы могли использовать все возможности языка.
extern "C"
, чего я не получил?.hpp
, но это расширение означает «заголовочный файл C ++», так и должно быть.h
, что используется как для C, так и для C ++.В дополнение к ответу Тимо - не существует стандартизированного ABI C ++ для некоторых платформ (например, Windows - некоторые, такие как Linux из Mac OS X, широко распространенного), так что дело не только в отсутствующей функции, но и в невозможности реализации такой функции.
Например, IIRC MSVC имеют разные ABI в каждой версии, и он может меняться в зависимости от того, является ли это отладкой или выпуском сборки - и не публикуется, поэтому сторонние компиляторы обычно не совместимы (я читал некоторую информацию о том, что некоторая версия icc совместима с MSVC 2005, но это может быть информация, раскрытая в NDA - необязательно доступная для создателей, скажем, Python) и использования их собственного ABI. Таким образом, на практике языковая среда ограничивает не только версию компилятора, но и флаги.
Наконец, C ++ имеет гораздо больше возможностей во время компиляции. Например, дженерики обычно не существуют в динамически типизированных языках и т. Д.
источник