Я видел понятие 'непрозрачных типов', брошенных вокруг немного, но я действительно не нашел сжатый ответ относительно того, что определяет непрозрачный тип в C и что еще более важно какие проблемы они позволяют нам решать с их существованием. Спасибо
Наиболее часто используется для библиотечных целей. Основной принцип непрозрачного типа в c - использовать данные через указатель, чтобы скрыть реализацию обработки данных. Поскольку реализация скрыта, вы можете изменить библиотеку без перекомпиляции какой-либо программы, которая зависит от нее (если интерфейс соблюдается)
например: версия 1:
// header file
struct s;
int s_init(struct s **x);
int s_f(struct s *x);
int s_g(struct s *x);
// source file
struct s { int x; }
int s_init(struct s **x) { *x = malloc(...); }
int s_f(..) { ... }
int s_g(..) { ... }
версия 2
// header file
struct s;
int s_init(struct s **x);
int s_f(struct s *x);
int s_g(struct s *x);
// source file
struct s { int y; int x; }
int s_init(struct s **x) { *x = malloc(...); }
int s_f(..) { ... }
int s_g(..) { ... }
Из вашей программы сбоку, ничего не изменилось! и, как было сказано ранее, нет необходимости перекомпилировать каждую программу, которая на нем основана.
В моем понимании, непрозрачные типы - это типы, которые позволяют вам держать хэндл (т.е. указатель) на структуру, но не изменять или просматривать ее содержимое напрямую (если вам это вообще разрешено, вы делаете это через вспомогательные функции, которые понимают внутреннюю структуру).
Непрозрачные типы - это, отчасти, способ сделать язык Си более объектно-ориентированным. Они позволяют инкапсуляцию, так что внутренние детали типа могут меняться - или быть реализованы по-разному на разных платформах/ситуациях - без изменения кода, который его использует.
Непрозрачный тип - это тип, который раскрывается в API через указатель, но никогда не определяется конкретно.