Ich erstelle eine C-Api, die einige Funktionen in einer DLL-Datei versteckt.
Da alles in C++ ist, arbeiten die meisten Funktionen mit Handles, die direkt auf diese Zeiger im Inneren der API abgebildet werden.
Um ein gewisses Maß an Typsicherheit für diese Griffe zu erhalten, definiere ich sie wie folgt:
typedef struct MyType1* MyType1Handle;
typedef struct MyType2* MyType2Handle;
Ich definiere MyType1 oder MyType2 an keiner Stelle, da ich sie nur als Zeiger verwende und einen Typ-Cast auf der Innenseite der API auf den tatsächlichen Zeigertyp durchführe.
Mein Problem ist, dass bei der Verwendung meiner Bibliothek in einem Clr-Projekt in Visual Studio ich diese erhalten warning: unresolved typeref token (token) for 'type'; image may not run.
http://msdn.microsoft.com/en-us/library/h8027ys9(VS.80).aspx
Es ist keine große Sache, da es funktioniert, aber es sieht unprofessionell aus.
Ich mag es nicht, void* zu verwenden:
typedef void* MyType1Handle;
typedef void* MyType2Handle;
Dadurch ist es möglich, eine Funktion, die einen MyType1Handle benötigt, mit einem MyType2Handle aufzurufen, da sie tatsächlich vom gleichen Typ sind.
Ein anderer Ansatz, den ich nicht verwenden möchte, ist etwa so
typedef int MyType1Handle;
typedef int MyType2Handle;
Dies würde gut funktionieren, solange ints und Zeiger die gleiche Größe haben, aber das ist nicht immer der Fall, und es scheint, wie es keine narrensichere Möglichkeit, eine plattformspezifische Zeigergröße Integer zu erhalten. Es hat die gleichen Probleme mit der Typsicherheit wie die void* sowie.
Ein anderer Ansatz, den ich ausprobiert habe, war folgender: Ich habe es so gemacht:
struct MyType1{};
typedef struct MyType1* MyType1Handle;
Dies funktionierte in C nicht, da leere Strukturen ungültiger C-Code sind. Ich könnte natürlich meine Struktur mit einem Dummy-Mitglied erweitern, aber es scheint, wie es eine bessere Möglichkeit, dies zu tun sein sollte.
Meine Frage läuft also auf Folgendes hinaus:
Wie spezifizieren Sie diese Art von Typen im Allgemeinen auf die kompatibelste Weise?