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?

Daniel Ribeiro
źródło

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.

Timo Geusch
źródło
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.

Maciej Piechotka
źródło
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