Что означает публичное представление кода 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 ++ скомпилированными отдельно (скомпилированными с разными компиляторами / флагами) для совместной работы, вместо того, чтобы молча проваливаться / зависать.
Мацей Пехотка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.