Ich arbeite an einem riesigen Projekt mit einer Datei A.h, deren Code eine Zeile hat
%Vor% Auch da ich auf Linux aufbaue und die dlinfo-Funktion verwende, muss ich die link.h-Datei in mein Projekt einfügen. Und hier entsteht ein Konflikt, weil ich zwei Typdefinitionen mit dem gleichen Namen Elf64_Half
habe. (Linux link.h enthält elftypes.h und es hat auch: typedef unsigned short Elf64_Half;
).
Was mache ich in einem solchen Fall? Ist die einzige Möglichkeit, meine Typedef in a.h zu ändern? Denken Sie daran, es ist nicht zu einfach, weil das Projekt riesig ist und ich an mehreren Stellen eine Änderung vornehmen muss.
Gibt es eine Möglichkeit, ein Typedef oder etwas zu deaktivieren?
Zur Klarstellung gab Rahul Manne eine einfache Lösung. Do
%Vor%Dies wird jede Elf64_Half in link.h durch The_Elf64_Half_I_dont_care ersetzen und somit keine Konflikte mit A.h. Solange du nicht Elf64_Half von link.h explizit verwenden willst, wird das ohne Probleme funktionieren. Sie müssen sich nur daran erinnern, dass Elf64_Half aus link.h nun The_Elf64_Half_I_dont_care heißt, falls Sie es jemals explizit in dieser Datei verwenden müssen.
Was mache ich in einem solchen Fall?
Ein gebräuchliches Mittel ist es, denjenigen, der die geringste Sichtbarkeit benötigt, hinter eine "Kompilierungs-Firewall" zu stellen. Das heißt, Ihre eigene Abstraktion / Schnittstelle zu erstellen, die die benötigte Funktionalität bereitstellt, und dann die Sichtbarkeit der enthaltenen Datei auf die * .cpp-Datei zu beschränken, indem Sie sie nur in diese * .cpp-Datei einfügen. Natürlich wäre es der * .cpp-Datei auch nicht erlaubt, die Kopfzeile mit der anderen Definition von typedef
zu enthalten.
Dann verursachen die Deklarationen keinen Konflikt, weil sie niemals für dieselbe Übersetzungseinheit sichtbar sind.
In Ihrem Beispiel würden Sie wahrscheinlich einen Wrapper für die benötigten dlinfo()
-Funktionalitäten erstellen. Zur Veranschaulichung:
DLInfo.hpp
%Vor%DLInfo.cpp
%Vor%Hier ist ein wenig Arbeit, die ich herausgefunden habe: Wenn Sie es zuerst als etwas anderes definieren, dann können Sie es später eingeben. Siehe hier im Beispiel (Ich bin auf OS X mit g ++):
%Vor%Die Ausgabe dieses Programms ist
%Vor%Betrachten Sie nun dieses modifizierte Programm:
%Vor%Die Ausgabe dieses Programms ist
%Vor%Um Ihre Frage zu beantworten, fügen Sie Ihrem Code eine Zeile hinzu:
%Vor%Aus Gründen der Übersichtlichkeit funktioniert das, weil Sie sie im Grunde alle umbenennen, aber Sie tun dies mit einem einzigen Befehl, anstatt alle Ihre eigenen Namen ändern zu müssen.
Tags und Links c++ header-files linux typedef