Andere C ++ - Verknüpfungssprachen als C?


25

Die C ++ - Sprache ermöglicht das Mischen von C ++ und C in einer Quelldatei. Beispielsweise,

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

Unterstützt C ++ oder hat es jemals andere "Verknüpfungssprachen" als C unterstützt? zB extern "Pascal"oderextern "Haskell"


Die meiste Zeit werden beide Sprachen ihr extern "C"Äquivalent tun, um miteinander zu interagieren
Ratschenfreak

C ++ unterstützt andere Verknüpfung , indem imlementations deren Verknüpfung Typen hinzufügen (§7.5), sollte die Frage sein , „Do - Implementierungen existieren oder haben implementtions bestanden“ ;-)
johannes

2
extern "C"Betrifft nur die Verknüpfung, nicht die Syntax und Semantik des Texts im Block. Mit anderen Worten, es ist immer noch C ++ in diesem extern "C"Block. Die Symbolnamen werden einfach nicht entstellt. Siehe stackoverflow.com/q/1041866/712605
Richard Hansen,

Antworten:


17

extern "C" kann die einzige erforderliche sein:

Jede Implementierung muss eine Verknüpfung zu Funktionen, die in der Programmiersprache C "C" geschrieben sind, und eine Verknüpfung zu C ++ - Funktionen "C ++" vorsehen.

Es können jedoch auch andere nach diesem Zitat existieren:

Das Zeichenfolgenliteral gibt die erforderliche Sprachverknüpfung an. Diese Internationale Norm legt die Semantik für die String-Literale "C" und "C ++" fest. Die Verwendung eines anderen Zeichenfolgenliteral als "C" oder "C ++" wird mit einer durch die Implementierung definierten Semantik bedingt unterstützt. [Anmerkung: Daher erfordert eine Verknüpfungsspezifikation mit einem String-Literal, das der Implementierung unbekannt ist, eine Diagnose. - end note] [Hinweis: Es wird empfohlen, die Schreibweise des String-Literal aus dem Dokument zu übernehmen, in dem diese Sprache definiert ist. Zum Beispiel Ada (nicht ADA) und Fortran oder FORTRAN, je nach Jahrgang. - Endnote]


1
Woher wird das zitiert?
Paul

@ Paul C ++ 11 Standard Entwurf
Aaronman

9

In vielen (meisten) Umgebungen ist "extern" C "die Standardverknüpfungskonvention für jede Sprache im System.

Abhängig vom Betriebssystem und der Implementierung der "fremden" Sprache "extern C" genügt es also, ein Programm in einer anderen kompilierten Sprache aufzurufen.


Sogar Umgebungen, die keine C-Verknüpfung verwenden (Pascal verwendet häufig eine andere Argumentreihenfolge für den Stapel und der Angerufene muss den Wert freigeben), haben einen C-kompatiblen Modus
Johannes,

@johannes: Eigentlich verwendet Windows für viele Dinge die Pascal - Konvention, aber da dies auch in C " extern "Language"" erforderlich ist und C nicht die Syntax hat, geschieht dies über eine plattformspezifische C - Erweiterung, so dass es für C ++ immer noch nur extern "C"und das Besondere ist Das Schlüsselwort gibt die unterschiedliche Aufrufkonvention an.
Jan Hudec

1
Es kann jedoch Fälle geben, in denen ein Compiler-Hersteller spezielle Verknüpfungstypen hinzufügt. Neben der Interoperabilität mit anderen Sprachen könnte dies auch für die Interoperabilität mit verschiedenen C ++ - Namensverwaltungen von Interesse sein. Die Frage ist, ob jemand hat :)
Johannes


-4
  • Nein! C ++ unterstützt nur C als "Verknüpfungssprache".

  • extern "C" {Strukturleiste {/ * ... * /}}

  • Die obige Syntax bedeutet, dass der Name der Variablen, Struktur oder Funktion nicht geändert wird. Weil C ++ möglicherweise den Namen von Variablen, Strukturen oder Funktionen ändert, um eine Überladung von Klassen, Namespaces und Funktionen zu implementieren.

  • Wenn Sie dies nicht tun, kann der Linker möglicherweise das Objekt der Variablen und der Funktionsstruktur nicht herausfinden.

  • C ++ ist so konzipiert, dass es mit C kompatibel ist. Das externe "C" ist der Weg, um kompatibel mit C zu implementieren.


10
Bitte überprüfen Sie §7.5 des C ++ Standards. extern "C"und extern "C++"sind die einzigen obligatorischen, aber Implementierungen dürfen andere bereitstellen.
Johannes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.