Ответ 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", что означает его указатель.