Mechanizm extern "C" umożliwia interakcję z kodem w języku C. Pozwala to na korzystanie z bibliotek C i ułatwia komunikację między C++ a innymi językami.
Historia pytania: Od samego początku język C++ był oparty na C, jednak miał swoje szczegóły, w tym 'name mangling', aby wspierać przeciążanie funkcji i inne funkcje.
Problem: Nazwa funkcji w C++ kompilowana jest do symbolu z dodatkowymi strukturami (mangled), ale w C nie ma takiej transformacji. W rezultacie niemożliwe jest po prostu dołączenie nagłówka kodu C do kompilatora C++ bez dodatkowych wysiłków.
Rozwiązanie:
Odwinięcie funkcji w konstrukcję extern "C" zabrania 'name mangling', czyniąc je widocznymi dla kodu skompilowanego przez kompilator C.
Przykład kodu:
#ifdef __cplusplus extern "C" { #endif void foo(int); #ifdef __cplusplus } #endif
Kluczowe cechy:
Czy można przeciążać funkcje z extern "C"?
Nie, przeciążanie jest niemożliwe, ponieważ używane jest standardowe C-nazwy funkcji.
Co się stanie, jeśli zadeklarujemy funkcję szablonową jako extern "C"?
Błąd kompilacji, ponieważ szablony to oddzielna cecha C++ i nie są wspierane w C.
Czy można używać extern "C" na poziomie pojedynczej klasy?
Nie, tylko dla funkcji i zmiennych, nie dla klas czy metod.
Projekt C++ podłącza zewnętrzną bibliotekę C bez extern "C", a następnie kod nie łączy się z powodu niezgodności nazw symboli.
Zalety:
Wady:
Używa się extern "C" w plikach nagłówkowych podczas integracji zewnętrznych bibliotek C.
Zalety:
Wady: