Ich entwickle eine Software, die in C ++ ist, aber über eine gemeinsame Header-Datei, die das Kommunikationsprotokoll enthält, mit einer C-App kommuniziert. Da C "basischer" als C ++ ist, muss ich immer den Header in C-Code schreiben (also bekommt C ++ auch); andernfalls würde es für die zweite App nicht funktionieren.
Das Problem ist, dass ich einen Scope-Quilifier wie C ++ namespace
s verwenden muss - die in C nicht existieren.
Was sind alle die Optionen zum Emulieren des namespace
-Features in C?
Die einzige Möglichkeit, die ich bisher gesehen habe, ist diejenige, die in dieser SO-Frage gezeigt wurde, aber leider Die Antwort ist nicht klar genug und ich würde gerne wissen, ob es andere Möglichkeiten gibt. Ich habe auch versucht, struct
s zu benutzen, um den Job zu machen, ohne Erfolg (zumindest unter Berücksichtigung eines struct
mit einem enum
erator).
Sie können alle exportierten Funktionen vor dem Export aus dem Modul mit static
auf der Definitionsebene ausblenden, so dass keine Namen im globalen Bereich platziert werden, und stattdessen in eine einzige Struktur eingefügt werden durch das Modul.
z. foo.h:
%Vor%foo.c:
%Vor%bar.c:
%Vor%Emulieren Sie Namespaces in C überhaupt nicht, gehen Sie den C-Weg:
_Generic
, um das Überladen von Argumenttypen zu simulieren. Ihre Include-Datei sollte diese C-Funktionen in einem inneren Detail-Namespace für C ++ definieren (ändert nicht die tatsächliche Identität der Funktionen aufgrund von C-Verknüpfung) und entfernt dann Präfixe und Suffixe von den C-Funktionen für C ++ br> Es sieht so aus:
%Vor%Vielleicht möchten Sie auch Member-Funktionen zu einigen der C-Structs für die C ++ - Schnittstelle hinzufügen, die Inline-Funktionen sein können, die an eine gemeinsame Funktion delegieren.
Zuerst fangen Sie an, indem Sie allen exportierten Symbolen (einschließlich der Namen von Präprozessor-Defines und Enum-Mitgliedern) einen Namespace voranstellen. Zum Beispiel könnten Sie eine Funktionsdeklaration haben
%Vor% Auf der C ++ - Seite müssen diese in extern "C" { … }
eingeschlossen werden und dann mit dem richtigen Namespace registriert werden. Unter der Annahme von C ++ 11 sollte dies bei Funktionen so einfach sein wie
Auf der C-Seite können Sie verkürzte Namen wie
definieren %Vor%verwenden compilerspezifische Attribute, um einen Alias zu registrieren oder eine konstante Deklaration hinzuzufügen
%Vor%Das funktioniert gut, weil das Aufrufen einer Funktion tatsächlich Funktionszeiger (statt Bezeichner) verwendet.
Sie könnten alles in einen einzelnen Header mit etwas #ifdef
s einfügen, oder Sie könnten kleine Wrapper wie foo/bar.hxx
für C ++ und foo/bar-import.h
für verkürzte C-Namen zusätzlich zu foo/bar.h
, das das tatsächliche enthält, bereitstellen Präfix Deklarationen und würde von den anderen Headern enthalten sein.
Ich habe an einem System gearbeitet, das sehr stark von Namespaces abhängig ist (build-type insert-ones), und wenn ich C betrachte, können Sie C++
namespaces (unter Linux sowieso) unvollkommen emulieren, indem Sie sammeln die Symbole, die Sie exportieren, um sie statisch zu verknüpfen, indem Sie ihnen den Namen objcopy
voranstellen und dann Ihren Header-Code (ohne Includes) mit dem vorangestellten Symbolsatz übersetzen.
Das Problem dabei ist, dass Makros den Gültigkeitsbereich nicht respektieren und daher annehmen, dass Ihre Bibliothek void foo()
(oder Symbol% co_de% kurz) exportiert - und Sie würden das in foo
voranstellen, dann ein Makro, das translate mylib_foo
in foo
würde auch struc Mitglieder namens mylib_foo
übersetzen, auch wenn diese nicht übersetzt werden sollten.
Ich glaube, dass es richtig wäre, beim Compiler zu hacken (und jemand macht es bitte!:)).
Tags und Links c c++ namespaces