Listing 1: Using a macro to typedef pointers to structures
/* This macro generates an opaque, unique, type whose name is * given by the _otype_ parameter. */ #define stlsoft_gen_opaque(_otype_) \ typedef const struct __stlsoft_otype_##_otype_{ int i;} *_otype_; stlsoft_gen_opaque(MyType1) stlsoft_gen_opaque(MyType2) MyType1 mt1 = 0x00000001; // Error MyType2 mt2 = reinterpret_cast<MyType2>(0x00000001); ///... void func(){ if(mt2 & 0x07070707) // Error { // ... } if(mt2 & reinterpret_cast<MyType2>(0x07070707)) // Error { // ... } if(reinterpret_cast<unsigned long>(mt2) & 0x07070707) { // ... } }