Что определяет непрозрачный тип в C, и когда они необходимы и / или полезны? - PullRequest
34 голосов
/ 20 февраля 2010

Я видел концепцию «непрозрачных типов», но я действительно не нашел краткого ответа относительно того, что определяет непрозрачный тип в C и, что более важно, какие проблемы они позволяют нам решать с их существованием. , Спасибо

Ответы [ 3 ]

32 голосов
/ 20 февраля 2010

Наиболее широко используется для библиотечных целей. Основным принципом непрозрачного типа в 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(..) { ... }

С вашей стороны программы ничего не изменилось! и, как было сказано ранее, нет необходимости перекомпилировать каждую программу, которая на него полагается.

13 голосов
/ 20 февраля 2010

В моем понимании непрозрачные типы - это те, которые позволяют вам держать дескриптор (то есть указатель) структуры, но не изменять или просматривать ее содержимое напрямую (если вам вообще разрешено, вы делаете это через помощник функции, которые понимают внутреннюю структуру).

Непрозрачные типы, отчасти, способ сделать C более объектно-ориентированным. Они допускают инкапсуляцию, так что внутренние детали типа могут изменяться - или реализовываться по-разному в разных платформах / ситуациях - без необходимости изменения кода, использующего его.

8 голосов
/ 20 февраля 2010

Непрозрачный тип - это тип, который предоставляется в API через указатель, но никогда не определяется конкретно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...