• 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++

Object Storage Arubacloud
0 głosów
279 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,190 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,000 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ź 137 wizyt
0 głosów
1 odpowiedź 114 wizyt
pytanie zadane 12 lutego 2019 w C i C++ przez Hailon Początkujący (310 p.)
0 głosów
0 odpowiedzi 497 wizyt
pytanie zadane 11 listopada 2019 w C i C++ przez CleaverMan Nowicjusz (140 p.)

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...