• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Łączenie językowe - c++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
365 wizyt
pytanie zadane 10 sierpnia 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
zamknięte 10 sierpnia 2019 przez enigmatycznyclay

Witam. Przerabiam fragkent książki Stephena Prosty o łączeniu językowym i mam spory problem z pełnym przyswojeniem i zrozumieniem stosowania prototypów z sygnalizacją łączenia jezykowego. Oto fragment przykladowych prototypów z książki.

extern "C" void spiff(int);
extern "C++" void spoff(int);

Prosiłbym o bardzo łopatologiczne wytłumaczenie kiedy stosować te prototypy. Rozumiem, że przy tworzeniu własnych funkcji jest to zbędne, a gdy dołączam do programu plik nagłówkowy to prototypy sa tam już gotowe. Z drugiej strony tworząc własne pliki z definicjami funkcji i pliki nagłówkowe z prototypami funkcji beda one domyslnie podczas kompilacji otrzymywały nazwy symboliczne C++ więc prototyp z sygnalizacją jest także jest zbędny. Kiedy w takim razie korzysta się z tego? W  książce jest coś prekompilowaniu funkcji biblioteki C ale jak coś takiego miałoby się odbywać?

komentarz zamknięcia: Wszystko jasne. Dziękuję za odpowiedzi
1
komentarz 10 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)

2 odpowiedzi

+2 głosów
odpowiedź 10 sierpnia 2019 przez Piotr Batko Stary wyjadacz (13,210 p.)
wybrane 10 sierpnia 2019 przez enigmatycznyclay
 
Najlepsza

Chodzi o to, że jak w C nazwiesz funkcję foo, to taki ona ma symbol w dalszej obróbce przez kompilator. W C++ jest inaczej. W C++ mamy przeładowanie nazw funkcji. Mogą być dwie funkcje o takiej samej nazwie, jeżeli różnią się parametrami. C++ pod spodem organizuje ten mechanizm w ten sposób, że do nazwy funkcji dokleja typy parametrów. Czyli funkcja w C foo ma nazwę podczas budowania foo. Funkcja foo w C++, która przyjmuje dwa inty, będzie się nazywać w trakcie budowania np. foo_int_int.

I teraz załóżmy, że masz bibliotekę zbudowaną kompilatorem języka C. Jest w tej bibliotece funkcja o nazwie foo. Piszesz kod w C++ i chcesz zawołać taką funkcję do pracy. Jeżeli nie powiesz kompilatorowi C++, że to funkcja z języka C, to on spróbuje wołać funkcję po swojemu, czyli będzie szukał foo_int_int. Nie uda mu się to, bo takiej funkcji nie ma, (jest foo), i zgłosi błąd. Możesz jednak powiedzieć mu, że foo pochodzi z innego świata, w którym nie dekoruje się nazw :)

extern "C" void foo(int a, int b);

 

1
komentarz 10 sierpnia 2019 przez tkz Nałogowiec (42,060 p.)

W C też ma przeciążenie funkcji. Od C11, Generic

+1 głos
odpowiedź 10 sierpnia 2019 przez Patrycjerz Mędrzec (192,320 p.)

Przeanalizujmy dwa przypadki.

Najpierw chcesz wywołać funkcję skompilowaną w C++ w języku C. Wtedy przy definicji zasobu w C++ wykorzystujesz wspomniane łączenie językowe `extern "C"`, natomiast w pliku nagłówkowym dla języka C w deklaracji funkcji już nie. Taki zbiór plików binarnych (biblioteki statycznej) i nagłówków umożliwi linkerowi języka C dostęp do zasobów zdefiniowanych w C++.

Z kolei gdybyś chciał uzyskać dostęp do funkcji skompilowanej w C w języku C++, no to zadeklarowałbyś w C++ funkcję z `extern "C"` i dołączył bibliotekę statyczną skompilowaną w języku C.

Reasumując, łączenia językowego używamy zarówno do deklaracji i definicji. Wszystko zależy, skąd lub gdzie chcemy użyć danego zasobu. Oczywiście definicja funkcji lub zmiennych za pomocą `extern "C"` umożliwia dostęp nie tylko z poziomu języka C, ale także jakiejkolwiek innej technologii, która wymaga reguł tego języka. Osobiście nie spotkałem się z użyciem `extern "C++"` i chyba nie ma to praktycznego zastosowania. Co do linkowania zasobów dynamicznie (np. z pliku DLL), to nie jestem pewien, czy jest wymagane użycie tego `extern "C"`, a jeśli tak, to w jakich sytuacjach.

Podobne pytania

0 głosów
1 odpowiedź 193 wizyt
0 głosów
1 odpowiedź 140 wizyt
pytanie zadane 12 lutego 2019 w C i C++ przez Hailon Początkujący (310 p.)
0 głosów
0 odpowiedzi 682 wizyt
pytanie zadane 11 listopada 2019 w C i C++ przez CleaverMan Nowicjusz (140 p.)

93,444 zapytań

142,436 odpowiedzi

322,698 komentarzy

62,806 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...