Что определяет непрозрачный тип в C, и когда они необходимы и/или полезны?

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

37
задан Alok Singhal 20 February 2010 в 07:38
поделиться

3 ответа

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

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

34
ответ дан 27 November 2019 в 04:49
поделиться

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

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

14
ответ дан 27 November 2019 в 04:49
поделиться

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

8
ответ дан 27 November 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: