Aby użyć kodu C++ w pliku C, przeczytałem, że możemy po prostu zrobić extern "C" { (where the c++ code goes here)}
, ale kiedy próbuję drukować coś za pomocą cout, ciągle dostaję błąd, ponieważ nie rozpoznaje biblioteki. Myślę, że jestem po prostu zdezorientowany, w jaki sposób zewnętrzne "C" pozwala ci na użycie kodu C++ w C.w jaki sposób extern "C" zezwala na kod C++ w pliku C?
Odpowiedz
Jest odwrotnie. Możesz użyć zewnętrznego C, aby dodać kod, który chcesz skompilować jako kod C przy użyciu kompilatora C++.
O ile czegoś mi brakuje, nie można skompilować kodu C++ za pomocą kompilatora C.
Konstrukcja extern "C"
jest składnią specyficzną dla C++, żaden kompilator języka C go nie zrozumie.
Dlatego prawie zawsze zobaczyć go w połączeniu z pewnym conditional compilation jak
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
Co extern "C"
robi jest po prostu hamować name mangling co oznacza, że symbole zdefiniowane w C++ plik źródłowy może być używany w program C.
Pozwala to na posiadanie projektu z mieszanymi źródłami C i C++, a źródło C może wywoływać funkcje C++, które zostały zdefiniowane jako extern "C"
.
Bardzo prosty i głupi przykład, żeby pokazać punkt:
Powiedzmy, że mamy plik źródłowy C, skompilowany z kompilatora C:
#include <stdio.h>
void foo(void); // Declare function prototype, so it can be called
int main(void)
{
printf("Calling foo...\n");
foo();
printf("Done\n");
return 0;
}
wtedy mamy C++ plik źródłowy dla foo
funkcję: plik źródłowy
#include <iostream>
extern "C" void foo()
{
std::cout << "Hello from foo\n";
}
C jest skompilowany z kompilatora C i C++ plik źródłowy jest kompilowany z C++. Następnie dwa pliki obiektów są ze sobą połączone, tworząc plik wykonywalny. Ponieważ foo
został zdefiniowany jako extern "C"
, jego nazwa symbolu w pliku obiektowym nie jest zniekształcona, a linker może rozwiązać odniesienie z pliku obiektu utworzonego przez kompilator C.
Działa również w drugim kierunku. Ponieważ symbole w C nie są zniekształcone, kompilator C++ musi o tym wiedzieć, a to się dzieje przez deklarowanie symboli C extern "C"
, zwykle w pliku nagłówkowym z użyciem kompilacji warunkowej, jak pokazano powyżej. Jeśli nie zostałby użyty extern "C"
, kompilator C++ pomyślałby, że symbole są symbolami C++ i łączą się z nazwami prowadzącymi do problemów z linkerem, gdy linker nie może znaleźć zniekształconych symboli.
Równie głupi przykład: Pierwszy plik C++ źródło
#include <iostream>
extern "C" void bar(); // Declare function prototype as an unmangled symbol
int main()
{
std::cout << "Calling bar...\n";
bar();
}
Następnie plik źródłowy C
#include <stdio.h>
void bar(void)
{
printf("Inside bar\n");
}
extern "C"
jest sposobem na wprowadzenie kodu C w kod C++. Mówiąc dokładniej, nakazuje kompilatorowi wyłączenie niektórych funkcji, takich jak przeciążanie funkcji, aby wyłączyć funkcję wymazywania nazw.W C++ prostej funkcji, takich jak:
int add(int a, int b) {
return a+b;
}
rzeczywiście trochę ostry nazwę w bibliotece do oznaczania parametrów tak, że jeśli można zdefiniować inną funkcję jak:
double add(double a, double b) {
return a+b;
}
że wie, który z nich zadzwonić . Nie chcesz tego, jeśli próbujesz korzystać z biblioteki C i do tego właśnie służy extern "C"
. Wszystko to jest powiedziane, extern "C"
nie zezwala na C++ w programie C.
Wyeksportowane symbole C++, jako wygenerowane przeze mnie kompilator, są zmanipulowane w celu dołączenia dodatkowych informacji o typie symbolu do łącznika.
zatem następujące funkcje przeciążone byłyby rozróżnialne przez łącznik w C++, ale nie C:
int fn();
int fn(int);
int fn(char*);
int fn(char*) const;
int fn(const char*);
Składnia extern "C" {
... }
pozwala na symbole (lub odniesienia do symboli C) określone w kodu C++, bez użycia zasady mangling
. Pozwala to na połączenie takiego kodu w C z bibliotekami C.
- 1. W jaki sposób extern działa w języku C++?
- 2. W jaki sposób * limit/* __ restrict__ działa w C/C++?
- 3. W jaki sposób można napisać kompilator C w C?
- 4. Najlepszy sposób na zapisanie pliku w C#
- 5. Kod C ze strukturami danych C++
- 6. W jaki sposób feof() działa w C
- 7. Język C/C kod ++ na platformie Android
- 8. sens ??? `-` w C++ kod
- 9. Kod zestawu w C++
- 10. Kod dynamiczne w C
- 11. extern „C” błąd # 2040: oczekuje identyfikator
- 12. W jaki sposób delegaci w języku C# są lepsze od wskaźników funkcji w C/C++?
- 13. W jaki sposób zaimplementowano C# Generics?
- 14. Czy mogę utworzyć funkcję "extern" c "`?
- 15. przekazywanie wskaźników do extern funkcji C w DLL z VB
- 16. C#: W jaki sposób należy zaimplementować ToString()?
- 17. zewnętrzne powiązanie "C" w przestrzeni nazw C++?
- 18. W jaki sposób używasz wyrażeń C# Lambda?
- 19. Czy "extern" C "` jest częścią typu funkcji?
- 20. Jaka jest różnica między `extern int (x) []` a `extern int x []` w C?
- 21. Windows i C++: extern i __declspec (dllimport)
- 22. Jak wywołać C++ DLL w C#
- 23. Jaki jest cel extern C i C++ dla pojedynczej funkcji (bsearch/qsort)?
- 24. Czytanie i pisanie na środku pliku binarnego w C/C++
- 25. Przetwarzanie pliku w C++
- 26. Jak migrować Objective-C stałe extern do Swift
- 27. Kod C++ w aplikacji na iPhone'a
- 28. Skompiluj kod C# w aplikacji
- 29. W jaki sposób osadzasz pliki zasobów w C?
- 30. Zrozum kod zestawu w c
Jest coś więcej niż "extern" C "" niż blokowanie wymazywania nazw. Robi inne rzeczy, aby umożliwić również połączenie między C i C++. – Peter