Sto creando un C api che nasconde alcune funzionalità in un file DLL.Il tipo giusto per le maniglie nelle interfacce C
Poiché tutto è C++ all'interno, la maggior parte delle funzioni funziona contro gli handle che si mappano direttamente a questi puntatori all'interno dell'API.
Per ottenere un certo grado di sicurezza tipo per quelle maniglie io li definisco così:
typedef struct MyType1* MyType1Handle;
typedef struct MyType2* MyType2Handle;
Io in realtà non definisco MyType1 o MyType2 in qualsiasi luogo da quando li uso solo come puntatori e fare un digitare il cast all'interno della API per il tipo di puntatore effettivo.
mio problema è che quando si utilizza la mia libreria in un progetto CLR in Visual Studio ottengo questo warning: unresolved typeref token (token) for 'type'; image may not run.
http://msdn.microsoft.com/en-us/library/h8027ys9(VS.80).aspx
E 'un grosso problema dal momento che funziona, ma sembra poco professionale.
non mi piace usare void *:
typedef void* MyType1Handle;
typedef void* MyType2Handle;
Ciò consente di chiamare una funzione vogliono un MyType1Handle con MyType2Handle dal momento che sono in realtà lo stesso tipo.
Un altro approccio che non voglio usare è qualcosa di simile
typedef int MyType1Handle;
typedef int MyType2Handle;
Questo potrebbe funzionare bene finché int di e puntatori hanno la stessa dimensione, ma che non è sempre il caso e sembra che ci non è un metodo infallibile per ottenere un intero di dimensioni puntatore specifico per piattaforma. Ha lo stesso tipo di problemi di sicurezza del vuoto * pure.
Un altro approccio che ho provato era di farlo in questo modo:
struct MyType1{};
typedef struct MyType1* MyType1Handle;
Questo non ha funzionato in C rispetto struct vuote è il codice C valido. Naturalmente potrei estendere la mia struttura con un membro fittizio, ma sembra che ci dovrebbe essere un modo migliore per farlo.
Quindi la mia domanda si riduce a:
Come generalmente si specifica questo tipo di tipi nel modo più compatibile?
Grazie per la risposta. Sembra che non sia il primo ad avere questo problema atleast :) – Laserallan
Una differenza qui è che nelle intestazioni pubbliche, il tipo HANDLE fa riferimento a un tipo concreto. La struttura finta è completamente definita. Ovviamente, definiscono DECLARE_HANDLE in modo diverso quando includono questi file nell'implementazione. – RBerteig