Wir haben eine große, alte C++ - Anwendung mit viel Legacy-Code und ein paar externe Bibliotheken in C geschrieben. Diese Bibliotheken werden sehr selten aktualisiert - nur wenn wir einen Fehler finden Der Hersteller liefert einen Patch. Dies geschah letzte Woche mit einer Bibliothek, und nach der Integration der neuen Version haben wir herausgefunden, dass unser Build mit dieser Fehlermeldung bricht, wenn wir die Bibliothek nicht lokal ändern (Umgang mit C-Bibliothek anonyme Struktur-Typen in C++
non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
)
Dies ist aufgrund der Bibliothek eine Reihe von Handle-Typen wie folgt erklärt:
#define _Opaque struct {unsigned long x;} *
typedef _Opaque Handle;
typedef _Opaque Request;
die wir Funktion Unterschriften in einigen Klassen auf unserer Seite verwenden:
class MyCls {
public:
static void* myFct(Handle handle);
...
}
Das führt zu dem obigen Fehler, da der Compiler keinen ordnungsgemäßen Namen-Mangled-Namen für die Funktion (en) erstellen kann, da die _Opaque-Struktur keinen Name hat.
Unsere aktuelle Abhilfe für diese ist die Bibliothek Header-Datei patchen, explizit die Struktur einen Namen zu geben:
//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
Das ist offensichtlich schlecht ist, weil wir die Bibliothek, wenn möglich, nicht berühren wollen. Eine weitere, noch schlechtere Option wäre, die Typen in alle Funktionssignaturen in void*
umzuwandeln und sie auf ihre jeweiligen Typen zurückzuschreiben. Und es gibt die schlechteste Möglichkeit, jede betroffene Funktion in reinem C ...
Also, meine Frage ist: Gibt es eine bessere Option als das Patchen der Bibliothek? Gibt es eine einfache Lösung, die ich übersehe? Was wäre der beste Weg, dies zu lösen?
Sehen Sie nicht, was das mit C zu tun hat. Ihr Problem ist Name Mangling der C++ Wrapper, nein? –
Dies könnte ein hervorragendes Argument für das Upgrade auf C++ 11 sein, für das diese Einschränkung nicht gilt. – ecatmur
@JensGustedt, richtig, aber ich habe es auch markiert C, weil die Bibliothek in C geschrieben ist und technisch ist es ein C/C++ Interoperabilitätsproblem. – l4mpi