2009-03-25 15 views
2

Der Offset von Makro scheint nicht unter C++/CLI zu funktionieren.Offset von Makro mit C++/CLI

Dies funktioniert gut in nicht verwalteten C++, sondern löst "Fehler C2275: 'Entity': Illegale Verwendung dieses Typs als Ausdruck" Fehler in CLI.

struct Property{ 
    char* label; 
    PropertyTypes type; 
    unsigned int member_offset; 
    unsigned int position; 
    unsigned char bit_offset; 
}; 

struct Entity{ 
    ... 
    bool transparent; 
    ... 
}; 

Property property = {"Transparent",  
     TYPE_BOOL,  
     offsetof(Entity, transparent), 
     0, 
     0}; // C2275 HERE 

Hat CLI einen Ersatz?

+0

Einige Code bitte. – dirkgently

Antwort

4

Meine Vermutung wäre, dass die Compiler-Nachricht auf: "Offsetof" ist kein bekanntes Makro und wenn es eine Funktion war seine Parameter dürfen nicht einen Typnamen enthalten.

bearbeiten: Als jemand in den Kommentaren darauf hingewiesen, offsetof ist eigentlich ein Teil des std lib. Also, was fehlt, ist wahrscheinlich nur

#include <cstddef> 

Alternativ können Sie dieses Makro-Implementierung verwenden (aus Win32/MFC-Header):

#ifdef _WIN64 
    #define OFFSET_OF(s, m)\ 
     (size_t)((ptrdiff_t)&reinterpret_cast<const volatile char&>((((s*)0)->m))) 
#else 
    #define OFFSET_OF(s, m)\ 
     (size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m)) 
#endif 
+0

ist Teil des C++ - Standards ... – DevSolar

+0

... vorausgesetzt, er * enthält * es tatsächlich ... – DevSolar

+0

Das Definieren eines eigenen Makros könnte verhindern, dass der Compiler eine intrinsische Implementierung verwendet. Für POD spielt das keine Rolle (und der Standard garantiert nur, dass der Offset für POD sowieso funktioniert). Einige Compiler verfügen jedoch über eine Intrinsic, die Nicht-POD-Typen korrekt verarbeiten kann. Dadurch wird selbst für eine Klasse, die eine mehrfache oder virtuelle Vererbung verwendet, ein konstanter Ausdruck für die Kompilierung angegeben. Dies führt dazu, dass Makroimplementierungen zur Laufzeit abstürzen. – Steve314

0

Sie müssen den Typ des Objekts angeben, dem Sie zuweisen. Es sieht so aus, als ob für das fragliche Mitglied ein Typunterschied besteht.

Siehe this für die Verwendung der Probe.

0

Nur ein Schuss im Dunkeln und ohne Chance dies nochmals zu überprüfen - sollte

offsetof(Entity, transparent), 

vielleicht lesen eher

offsetof(struct Entity, transparent), 

???

+0

Spot auf. Sein Fehler ist wahrscheinlich auf den meisten Code da draußen zurückzuführen, der einen Typedef der Struktur ausführt. – alecco

1

Standard C++ hat bereits eine Alternative; &Entity::transparent. Wahrscheinlich möchten Sie Vorlagen verwenden, wenn Sie die Property-Klasse neu gestalten. Der Typ eines Pointer-to-Members ist nicht-trivial.