Języki powiązań C ++ inne niż C?

25

Język C ++ umożliwia łączenie C ++ i C w jednym pliku źródłowym. Na przykład,

extern "C" {
    struct bar { /* ... */ }
}

Czy C ++ lub czy kiedykolwiek obsługiwał inne „języki powiązań” inne niż C? np. extern "Pascal"lubextern "Haskell"

dkaranovich
źródło
przez większość czasu oba języki robią, co w ich mocy, extern "C"aby ze sobą współdziałać
maniak zapadkowy
C ++ obsługuje inne powiązania, umożliwiając imlementacjom dodawanie ich typów powiązań (§ 7.5), pytanie powinno brzmieć: „Czy istnieją implementacje lub istnieją implementacje” ;-)
johannes
2
extern "C"wpływa tylko na łączenie, a nie na składnię i semantykę tekstu wewnątrz bloku. Innymi słowy, nadal jest C ++ wewnątrz tego extern "C"bloku; nazwy symboli po prostu nie są zniekształcone. Zobacz stackoverflow.com/q/1041866/712605
Richard Hansen,

Odpowiedzi:

17

extern "C" może być jedynym wymaganym:

Każde wdrożenie powinno zapewniać powiązanie z funkcjami napisanymi w języku programowania C „C” oraz połączenie z funkcjami C ++ „C ++”.

Jednak inne mogą istnieć zgodnie z tym cytatem:

Literał łańcuchowy wskazuje wymagane powiązanie językowe. Niniejszy standard międzynarodowy określa semantykę literałów łańcuchowych „C” i „C ++”. Użycie literału łańcuchowego innego niż „C” lub „C ++” jest obsługiwane warunkowo, z semantyką zdefiniowaną w implementacji. [Uwaga: Dlatego specyfikacja powiązania z literałem łańcuchowym, która jest nieznana implementacji, wymaga diagnostyki. - uwaga końcowa] [Uwaga: Zaleca się, aby pisownia literału-ciągu została pobrana z dokumentu definiującego ten język. Na przykład Ada (nie ADA) i Fortran lub FORTRAN, w zależności od rocznika. - uwaga końcowa]

aaronman
źródło
1
Skąd to jest cytowane?
Paul
@paul c ++ 11 standardowy projekt
aaronman
9

W wielu (większości) środowiskach „extern” C jest domyślną konwencją łączenia dla dowolnego języka w systemie.

Zatem w zależności od systemu operacyjnego i implementacji „obcego” języka „extern C” wystarczy wywołać program w innym skompilowanym języku.

James Anderson
źródło
Środowiskach nawet nie używając C podnośnik (Pascal czyli często wykorzystuje inną kolejność argumentów na stosie i wywoływany musi uwolnić wartość) mają trybie C-kompatybilny
Johannes
@ johannes: Właściwie Windows używa konwencji Pascala do wielu rzeczy, ale ponieważ potrzebuje tego również w C, a C nie ma extern "Language"składni „ ”, robią to za pomocą specyficznego dla platformy rozszerzenia C, więc dla C ++ jest to po prostu extern "C"specjalne słowo kluczowe określa inną konwencję wywoływania.
Jan Hudec
1
Nadal mogą zdarzać się przypadki, gdy dostawca kompilatora dodaje specjalne typy powiązań. Oprócz interoperacyjności z innymi językami może to być również interesujące ze względu na współdziałanie z różnymi zmianami nazw C ++. Pytanie brzmi, czy ktokolwiek to zrobił :)
johannes
-4
  • Nie! C ++ obsługuje tylko C jako „języki powiązań”.

  • extern „C” {struct bar {/ * ... * /}}

  • Składnia jak wyżej oznacza, że ​​nie zmieniają nazwy zmiennej, struktury ani funkcji. Ponieważ C ++ może zmienić nazwę zmiennej, struktury lub funkcji, aby zaimplementować przeciążenie klasy, przestrzeni nazw i funkcji.

  • Jeśli tego nie zrobisz, linker może nie znaleźć obiektu zmiennej, struktury funkcji.

  • C ++ jest zaprojektowany tak, aby był kompatybilny z C. Zewnętrzny „C” jest sposobem implementacji kompatybilnym z C.

Edward Shen
źródło
10
Sprawdź § 7.5 standardu C ++. extern "C"i extern "C++"są jedynymi obowiązkowymi, ale implementacje mogą zapewniać inne.
johannes