OS X: почему __LP64__ приводит к чисто виртуальным функциям? - PullRequest
4 голосов
/ 04 мая 2011

Я пытаюсь обновить какой-то код приблизительно из *2003* I / O и работаю с чем-то странным: есть несколько мест, где методы объявляются как чисто виртуальные, только если __LP64__ макрос препроцессора установлен. Пример из IOBlockStorageDevice :

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

В вышеприведенном примере, зачем форсировать реализацию getWriteCacheStatus в> = 10.4, а не в 10.3? Это просто случай «мы должны были сделать это раньше» или есть что-то более глубокое, чего я не вижу (как это обычно бывает).

1 Ответ

3 голосов
/ 05 мая 2011

Я предполагаю, что 32-битная версия включает реализацию по умолчанию, к которой следует обращаться к драйверам, написанным до того, как метод был представлен.Так как никогда не было 64-битной версии OSX, которая не включала бы этот метод, им не нужно предоставлять запасной вариант.Я видел подобные шаблоны в других частях IOKit для новых методов, которые заменяют устаревшие методы.Устаревший метод существует только в 32-разрядном режиме и по умолчанию вызывает новый метод.Новый метод является чисто виртуальным в 64-битном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...