C ++ Externe Deklaration Isolation

9

Betrachten Sie Folgendes:

%Vor%

Dieser Code deklariert eine externe Funktion mit C-Verknüpfung in einem Namespace. Dies macht es möglich, sich auf eine solche Funktion aus einem privaten Namensraum zu beziehen, wodurch die resultierende Namensraumverschmutzung vermieden wird, die durch eine gewöhnliche globale externe Deklaration verursacht wird. Es ermöglicht auch, dass Client-Code andere (hoffentlich kompatible) Deklarationen für die gleiche Funktion ohne Konflikte ausgibt, sogar im globalen Namespace, der möglicherweise von einer vom Hersteller bereitgestellten Header-Inclusion stammt.

Ich verlasse mich oft auf ähnliche Konstrukte in C und C ++, um Kompilationen aus fehlerhaften oder in Konflikt stehenden Headerdateien zu isolieren, die mit einigen Bibliotheken bereitgestellt werden. (In C wird dies erreicht, indem die erforderlichen Deklarationen im Funktionsumfang ausgegeben werden, was auch in C ++ möglich wäre, wenn die Verknüpfungsdeklaration extern im Funktionsumfang nicht erlaubt wäre.) Dies ist besonders nützlich für die korrekte Verknüpfung mit einem gut definierte ABI, ohne auf Hersteller-Header-Dateien angewiesen zu sein.

Ist es möglich, dasselbe mit Funktionen oder Methoden mit regulärer C ++ - Verknüpfung zu tun? Das heißt: eine externe Funktion mit C ++ - Verknüpfung in einem privaten Namespace (oder in einem beliebigen lokalen Bereich) zu deklarieren , aber was bezieht sich möglicherweise auf eine Funktion, die tatsächlich innerhalb eines anderen -Namensraums definiert ist?

Beabsichtigte Funktionalität (Pseudocode):

%Vor%

Dies ist offensichtlich kein Problem für Quelldateien (im Gegensatz zu Header-Dateien), da Namespace-Verschmutzung in diesem Fall keine Rolle spielt. Daher bezieht sich diese Frage hauptsächlich auf das Isolieren von Deklarationen in Bibliotheksheaderdateien (zur Verwendung in Vorlagen und Inline-Funktionen).

Compiler-spezifische Lösungen sind willkommen (MSVC und GCC sind von Interesse).

Beispiel: Angenommen, meine Bibliothek heißt Lib1 und ich möchte alles innerhalb des Namensraums Lib1 deklarieren.

%Vor%

Angenommen, meine Bibliothek verweist auf eine andere Bibliothek, Lib2 , die eine C-Bibliothek von jemand anderem ist.

%Vor%

In meiner Bibliothek kann ich auf Entitäten von Lib2 verweisen, ohne dass Lib2.h enthalten sein muss, wenn dies aus irgendeinem Grund benötigt wird:

%Vor%

Gleichzeitig ist es einem Client-Code möglich, sowohl Lib1.hpp als auch Lib2.h (ohne Berücksichtigung von C ++ - freundlich) ohne Konflikte einzubinden.

Angenommen, es gibt eine dritte Bibliothek, Lib3 , die eine C ++ - Bibliothek ist und Entitäten im Namensraum Lib3 deklariert.

%Vor%

Gibt es eine Möglichkeit, sich mit Lib3 genauso zu verbinden wie mit Lib2 ? Das heißt: beziehen Sie sich auf Entitäten in Lib3 in Lib1.hpp , ohne Lib3.hpp einzuschließen, aber weiterhin zuzulassen, dass Client-Code sowohl Lib1.hpp als auch Lib3.hpp ohne Probleme enthält?

Wenn in Lib1 angegeben wird:

%Vor%

dann können Konflikte auftreten, wenn der Client-Code sowohl Lib1.hpp als auch Lib3.hpp enthält - sicherlich nicht in diesem einfachen Beispiel, in dem die Deklarationen identisch sind, aber feine Unterschiede in realen Situationen können Warnungen oder Fehler auf Syntaxebene auslösen, Selbst wenn der zugrundeliegende ABI derselbe ist, da dies die Prämisse verletzt, nichts außerhalb des Namensraums Lib1 zu deklarieren.

Ich hoffe, das hilft, die Frage zu verstehen.

    
alecov 02.10.2013, 03:06
quelle

1 Antwort

1

Ist dies nicht nur die beabsichtigte Verwendung der using -Direktive in C ++?

%Vor%     
Quuxplusone 03.10.2013 22:48
quelle

Tags und Links