#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-разрядном режиме.