OS X: почему __LP64__ приводит к чисто виртуальным функциям?

#macos #64-bit #iokit #pure-virtual

#macos #64-разрядная #iokit #чисто виртуальный

Вопрос:

Я пытаюсь обновить некоторый код набора ввода-вывода, выпущенный примерно в 2003 году, и сталкиваюсь с чем-то странным: есть несколько мест, где методы объявляются как чисто виртуальные, только если установлен макрос __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:

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