Что означает публичное представление кода C ++ в виде API C и каковы преимущества этого?

25

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

Что это значит и каковы преимущества этого?

Даниэль Рибейро
источник

Ответы:

44

Это означает, что часть вашей библиотеки, которая отображается как интерфейс, использует только «часть» языка C, поэтому вы не экспортируете классы или аналогичные элементы, а только функции, POD и структуры, содержащие POD. Кроме того, вы должны отключить искажение имен в C ++, обычно это достигается путем пометки функций как extern "C". Типичным примером будет:

extern "C" void foo(int bar);

Большое преимущество демонстрации ваших библиотек таким образом состоит в том, что почти каждый язык программирования имеет механизм прямого взаимодействия с библиотекой C, но лишь очень немногие могут напрямую взаимодействовать с библиотекой C ++. Таким образом, в этом смысле вы выбираете наименьший общий знаменатель, чтобы другим людям было проще использовать вашу библиотеку.

Однако имейте в виду, что это действительно только полезная стратегия, если вы создаете библиотеку для использования другими людьми. Если вы создаете часть программного обеспечения, предназначенного только для C ++, и библиотекам нужно только взаимодействовать друг с другом, вам (ИМХО) лучше показывать надлежащие API C ++, чтобы вы могли использовать все возможности языка.

Тимо Гюш
источник
14
Вы должны быть осторожны, чтобы не экспортировать выброшенные исключения!
Джеймс
Это отличный ответ. Можете ли вы привести пример того extern "C", чего я не получил?
Даниэль Рибейро
1
@DanielRibeiro: просто Google для "Extern C". Вы найдете ссылки, подобные этой: stackoverflow.com/questions/1041866/…
Док Браун
1
@DanielRibeiro, добавлен очень простой пример.
Тимо Геуш
1
@DanielRibeiro Технически возможно все еще использовать .hpp, но это расширение означает «заголовочный файл C ++», так и должно быть .h, что используется как для C, так и для C ++.
Leemes
8

В дополнение к ответу Тимо - не существует стандартизированного ABI C ++ для некоторых платформ (например, 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 ++ скомпилированными отдельно (скомпилированными с разными компиляторами / флагами) для совместной работы, вместо того, чтобы молча проваливаться / зависать.
Мацей Пехотка