Есть ли у кого-то хорошее объяснение того, что такое "непрозрачный тип"? Я видел этот термин в контексте CFBundleRef
, где они говорили: "CFBundleRef opaque type". Это тип, который только для чтения?
Что означает термин "непрозрачный тип" в контексте "непрозрачного типа CFBundleRef"?
Ответ 1
"непрозрачный тип" - это тип, в котором у вас нет полного определения для struct
или class
. В C, С++ и Objective-C вы можете сообщить компилятору, что тип будет определен позже с помощью объявления forward:
// forward declaration of struct in C, C++ and Objective-C
struct Foo;
// forward declaration of class in C++:
class Bar;
// forward declaration of class in Objective-C:
@class Baz;
В компиляторе недостаточно информации, позволяющей делать что-либо непосредственно с помощью struct
или class
, кроме указателей объявления, но это часто все, что вам нужно сделать. Это позволяет разработчикам библиотек и рамок скрывать детали реализации. Пользователи библиотеки или структуры затем вызывают вспомогательные функции для создания, управления и уничтожения экземпляров объявленных вперед struct
или class
. Например, создатель фреймворка мог бы создать эти функции для struct Foo
:
struct Foo *createFoo(void);
void addNumberToFoo(struct Foo *foo, int number);
void destroyFoo(struct Foo *foo);
В рамках основы Core Foundation Apple предоставляет общие классы Objective-C, такие как NSString
, NSArray
и NSBundle
, доступные программистам C через непрозрачные типы. Программисты C используют указатели и вспомогательные функции для создания, управления и уничтожения экземпляров этих классов Objective-C. Apple называет это "беспошлинным мостом". Они следуют общему соглашению об именах: префикс "CF" + имя класса + "Ref" суффикс, где "CF" означает "Core Foundation", а "Ref" - сокращение для "Reference", что означает его указатель.
Ответ 2
Непрозрачный тип - это тип, который "обертывает" типы нижнего уровня и часто используется, когда основная реализация сложна, или пользователю просто не нужно знать о внутренней работе. У Apple есть хорошая страница о непрозрачных типах здесь:
Например, CFString является непрозрачным типом, потому что он обертывает массив символов, поддерживает его длину, его кодировку и т.д., но напрямую не разрешает пользователю получать доступ к этим значениям. Скорее он предоставляет методы, которые обеспечивают доступ или манипулируют внутренними полями и возвращают пользователю соответствующую информацию.
Ответ 3
Это будущая структура. Например:
typedef struct CFBundle *CFBundleRef;
Без фактического определения "struct CFBundle" ваш код не сможет получить доступ к чему-либо в указателе CFBundleRef. Это непрозрачно.