Co to znaczy publicznie udostępniać kod C ++ jako API C i jakie są zalety tego działania?


25

Często słyszę, jak ludzie mówią, że programiści C ++ powinni ujawnić publiczny interfejs API swojej biblioteki / produktu jako interfejs API języka C.

Co to znaczy i jakie są tego zalety?

Odpowiedzi:


44

Oznacza to, że część twojej biblioteki, która jest widoczna jako interfejs, używa tylko „części” języka C, więc nie eksportujesz klas lub podobnych, tylko funkcje, POD i struktury zawierające POD. Dodatkowo musisz wyłączyć manipulowanie nazwami C ++, zwykle osiągane przez oznaczenie funkcji jako extern "C". Typowy przykład to:

extern "C" void foo(int bar);

Dużą zaletą ujawniania bibliotek w ten sposób jest to, że prawie każdy język programowania ma mechanizm bezpośredniego interfejsu z biblioteką C, ale tylko nieliczni mogą również bezpośrednio łączyć się z biblioteką C ++. W tym sensie wybierasz najniższy wspólny mianownik, aby ułatwić innym użytkownikom korzystanie z Twojej biblioteki.

Pamiętaj jednak, że jest to naprawdę przydatna strategia, jeśli tworzysz bibliotekę do wykorzystania przez innych ludzi. Jeśli budujesz część oprogramowania opartego tylko na C ++, a biblioteki muszą się ze sobą komunikować, lepiej (IMHO) udostępnić odpowiednie interfejsy API C ++, abyś mógł w pełni korzystać z pełnej mocy języka.


14
Musisz też uważać, aby nie eksportować zgłaszanych wyjątków!
James

To świetna odpowiedź. Czy możesz podać mi przykład extern "C"rzeczy, których nie dostałem?
Daniel Ribeiro

1
@DanielRibeiro: po prostu google dla „extern C”. Znajdziesz linki takie jak ten: stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, dodano bardzo prosty przykład.
Timo Geusch

1
@DanielRibeiro Technicznie możliwe jest nadal używanie .hpp, ale to rozszerzenie oznacza „plik nagłówkowy C ++”, więc tak powinno być .h, które jest używane zarówno w C, jak i C ++.
leemes

8

Oprócz odpowiedzi Timo - dla niektórych platform (na przykład Windows - niektóre takie jak Linux Mac OS X powszechnie stosowane) nie ma znormalizowanego C ++ ABI, więc nie chodzi tylko o brak funkcji, ale o niemożność implementacji takiej funkcji.

Na przykład IIRC MSVC ma różne ABI w każdej wersji i może się zmienić w zależności od tego, czy jest to debugowanie, czy wydanie kompilacji - i nie jest publikowany, więc kompilatory innych firm zwykle nie są kompatybilne (czytam informacje, że niektóre wersje icc są kompatybilne z MSVC 2005, ale może to być informacja ujawniona w ramach NDA - niekoniecznie dostępna dla twórców powiedzmy Python) i wykorzystująca własny ABI. Tak więc w praktyce środowisko językowe ograniczyłoby nie tylko wersję kompilatora, ale także flagi.

Wreszcie C ++ ma znacznie więcej funkcji kompilacji. Na przykład, generyczne zwykle nie istnieją w dynamicznie pisanych językach itp.


2
@DanielRibeiro: Witamy w cudownym piekle C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). Krótka wersja jest taka, że ​​bardzo trudno jest osobno skompilować komponenty C ++ (skompilowane z różnymi kompilatorami / flagami) zamiast cicho zawieść / zawiesić się.
Maciej Piechotka
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.