Непрозрачный указатель - это указатель, в котором не раскрываются подробности базовых данных (из словарного определения: непрозрачный: прилагательное; невозможно увидеть сквозь; не прозрачный ).
Например, вы можете объявить в заголовочном файле (это из моего реального кода):
typedef struct pmpi_s *pmpi;
, который объявляет тип pmpi
, который является указателем на непрозрачную структуру struct pmpi_s
, следовательно, все, что вы объявите как pmpi
, будет непрозрачным указателем.
Пользователи этой декларации могут свободно писать код, такой как:
pmpi xyzzy = NULL;
, не зная фактического «определения» структуры.
Затем в коде, который знает об определении (т. Е. В коде, обеспечивающем функциональность для обработки pmpi
), вы можете «определить» структуру:
struct pmpi_s {
uint16_t *data; // a pointer to the actual data array of uint16_t.
size_t sz; // the allocated size of data.
size_t used; // number of segments of data in use.
int sign; // the sign of the number (-1, 0, 1).
};
и легкий доступ к отдельным его полям, что не может сделать пользователь заголовочного файла.
Дополнительную информацию можно найти на странице Википедии для непрозрачных указателей.
Основное назначение - скрыть детали реализации от пользователей вашей библиотеки. Инкапсуляция (несмотря на то, что вам скажет C ++) существует уже давно: -)
Вы хотите опубликовать достаточно информации о своей библиотеке, чтобы пользователи могли эффективно использовать ее, и не более. Публикация большего количества данных дает пользователям сведения, на которые они могут полагаться (например, тот факт, что Переменная размера sz
находится в определенном месте в структуре, что может привести к тому, что они будут обходить ваши элементы управления и манипулировать им напрямую.
Тогда вы обнаружите, что ваши клиенты горько жалуются, когда вы меняете внутренние устройства. Без этой информации о структуре ваш API ограничивается только тем, что вы предоставляете, и ваша свобода действий в отношении внутренних компонентов сохраняется.