Wie kann man das C ++ - Namespace-Feature in einem C-Code emulieren?

8

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).

    
Momergil 21.08.2014, 17:27
quelle

4 Antworten

8

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%     
Leushenko 21.08.2014 17:34
quelle
5

Emulieren Sie Namespaces in C überhaupt nicht, gehen Sie den C-Weg:

  • Verwenden Sie Präfixe anstelle von Namespaces.
  • Verwenden Sie Suffixe anstatt zu überladen.
    • Verwenden Sie optional ein Makro mit _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.

    
Deduplicator 21.08.2014 17:42
quelle
2

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

%Vor%

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.

    
Christoph 22.08.2014 00:02
quelle
0

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!:)).

    
PSkocik 25.04.2016 15:50
quelle

Tags und Links