Domanda

Sto tentando di aggiornare alcuni circa-2003 Kit i/o codice e sto correndo per qualcosa di strano: ci sono alcuni posti in cui i metodi sono dichiarati virtuali puri solo se il __LP64__ La macro preprocessore è impostata. Esempio, da IoblockStoragegeEvice:

public
#ifdef __LP64__
    virtual IOReturn    getWriteCacheState(bool *enabled)   = 0;
#else /* !__LP64__ */
    virtual IOReturn    getWriteCacheState(bool *enabled); /* 10.3.0 */
#endif /* !__LP64__ */

Nell'esempio sopra, perché forzare l'implementazione di getwritecachestatus in> = 10.4 ma non in 10.3? È solo un caso di "avremmo dovuto farlo prima" o c'è qualcosa di più profondo che non vedo (che di solito è il caso).

È stato utile?

Soluzione

La mia ipotesi è che la versione a 32 bit includa un'implementazione predefinita su cui ricadere per i conducenti scritti prima che il metodo fosse introdotto. Dato che non c'è mai stata una versione a 64 bit di OSX che non includeva quel metodo, non hanno bisogno di fornire un fallback. Ho visto schemi simili in altre parti di Iokit per nuovi metodi che sostituiscono i metodi deprecati. Il metodo deprecato esiste solo in modalità a 32 bit e per impostazione predefinita chiama il nuovo metodo. Il nuovo metodo è puro virtuale in modalità a 64 bit.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top