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?
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:
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.
extern "C"
rzeczy, których nie dostałem?
.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 ++.
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.