Was bedeutet es, einen C ++ - Code als C-API öffentlich zugänglich zu machen und welche Vorteile bietet dies?


25

Ich höre oft Leute sagen, dass C ++ - Programmierer die öffentliche API ihrer Bibliothek / ihres Produkts als C-API verfügbar machen sollten.

Was bedeutet das und was sind die Vorteile davon?

Antworten:


44

Dies bedeutet, dass der Teil Ihrer Bibliothek, der als Schnittstelle verfügbar gemacht wird, nur den C-Teil der Sprache verwendet, sodass Sie keine Klassen oder ähnliches exportieren, sondern nur Funktionen, PODs und Strukturen, die PODs enthalten. Außerdem müssen Sie die C ++ - Namensverknüpfung deaktivieren, die normalerweise durch Markieren von Funktionen als erreicht wird extern "C". Ein typisches Beispiel wäre:

extern "C" void foo(int bar);

Der große Vorteil, wenn Sie Ihre Bibliotheken auf diese Weise verfügbar machen, besteht darin, dass so gut wie jede Programmiersprache einen Mechanismus zur direkten Anbindung an eine C-Bibliothek hat, aber nur sehr wenige können auch eine direkte Anbindung an eine C ++ - Bibliothek haben. In diesem Sinne wählen Sie den kleinsten gemeinsamen Nenner, um anderen Benutzern die Verwendung Ihrer Bibliothek zu erleichtern.

Beachten Sie jedoch, dass dies nur dann eine nützliche Strategie ist, wenn Sie eine Bibliothek erstellen, die andere Benutzer nutzen können. Wenn Sie eine reine C ++ - Software erstellen und die Bibliotheken nur miteinander kommunizieren müssen, sollten Sie (meiner Meinung nach) die richtigen C ++ - APIs verfügbar machen, damit Sie die volle Leistungsfähigkeit der Sprache nutzen können.


14
Sie müssen aufpassen, dass Sie auch keine ausgelösten Ausnahmen exportieren!
James

Das ist eine großartige Antwort. Kannst du mir ein Beispiel geben extern "C", das ich nicht bekommen habe?
Daniel Ribeiro

1
@DanielRibeiro: google einfach nach "extern C". Sie finden Links wie diesen: stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, sehr einfaches Beispiel hinzugefügt.
Timo Geusch

1
@DanielRibeiro Es ist technisch möglich, noch zu verwenden .hpp, aber diese Erweiterung bedeutet "C ++ Header-Datei", so sollte es sein .h, die sowohl für C als auch C ++ verwendet wird.
Leemes

8

Zusätzlich zu Timos Antwort gibt es für einige Plattformen (zum Beispiel Windows - einige wie Linux von Mac OS X sind weit verbreitet) kein standardisiertes C ++ ABI, sodass es nicht nur um fehlende Funktionen geht, sondern auch um die Unmöglichkeit, solche Funktionen zu implementieren.

Zum Beispiel hat IIRC MSVC in jeder Version unterschiedliche ABI und es kann sich ändern, je nachdem, ob es sich um Debug- oder Release-Build handelt - und es wird nicht veröffentlicht, so dass Compiler von Drittanbietern normalerweise nicht kompatibel sind (ich habe einige Informationen gelesen, dass einige Versionen von icc mit MSVC kompatibel sind 2005 könnte es sich jedoch um Informationen handeln, die unter NDA veröffentlicht wurden (nicht unbedingt für Entwickler von etwa Python verfügbar) und deren eigene ABI verwenden. In der Praxis würde die Sprachumgebung also nicht nur die Compilerversion, sondern auch die Flags einschränken.

Schließlich bietet C ++ wesentlich mehr Funktionen zur Kompilierung. Zum Beispiel existieren Generika normalerweise nicht in den dynamisch getippten Sprachen usw.


2
@DanielRibeiro: Willkommen in der wunderbaren Hölle von C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). Kurzfassung ist, dass es sehr schwierig ist, C ++ - Komponenten separat kompilieren zu lassen (mit verschiedenen Compilern / Flags kompiliert), um zusammenzuarbeiten, anstatt stillschweigend zu versagen / abstürzen.
Maciej Piechotka
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.