OS X: pourquoi __LP64__ conduit-il à de pures fonctions virtuelles?
-
28-10-2019 - |
Question
J'essaie de mettre à jour certains I / O Kit et je suis en cours d'exécution vers quelque chose d'étrange: il y a quelques endroits où les méthodes sont déclarées comme purement virtuelles uniquement si le préprocesseur __LP64__
la macro est définie.Exemple, tiré de IOBlockStoragea>:
public
#ifdef __LP64__
virtual IOReturn getWriteCacheState(bool *enabled) = 0;
#else /* !__LP64__ */
virtual IOReturn getWriteCacheState(bool *enabled); /* 10.3.0 */
#endif /* !__LP64__ */
Dans l'exemple ci-dessus, pourquoi forcer l'implémentation de getWriteCacheStatus dans>= 10.4 mais pas dans 10.3?Est-ce juste un cas de "nous aurions dû faire ça avant" ou y a-t-il quelque chose de plus profond que je ne vois pas (ce qui est généralement le cas).
La solution
Je suppose que la version 32 bits comprend une implémentation par défaut sur laquelle se rabattre pour les pilotes écrits avant l'introduction de la méthode.Puisqu'il n'y a jamais eu de version 64 bits d'OSX qui n'incluait pas cette méthode, ils n'ont pas besoin de fournir une solution de secours.J'ai vu des modèles similaires dans d'autres parties d'IOKit pour les nouvelles méthodes qui remplacent les méthodes obsolètes.La méthode obsolète n'existe qu'en mode 32 bits et appelle par défaut la nouvelle méthode.La nouvelle méthode est purement virtuelle en mode 64 bits.