Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
  • M main
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Container Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • c-language
  • main
  • Wiki
  • Opaque types

Opaque types · Changes

Page history
Create Opaque types authored Jan 08, 2021 by Igor Zhirkov's avatar Igor Zhirkov
Hide whitespace changes
Inline Side-by-side
Showing with 52 additions and 0 deletions
+52 -0
  • Opaque-types.md Opaque-types.md +52 -0
  • No files found.
Opaque-types.md 0 → 100644
View page @ 22c1518e
Есть способ скрыть реализацию структуры внутри модуля. Например:
```c
/* file.h */
// Только объявление структуры, без определения
struct s;
// Можно создавать функции, которые принимают указатель на такую структуру или возвращают его.
bool s_is_good( struct s* some_struct );
/* Нельзя:
bool s_is_good( struct s some_struct );
Мы не знаем устройство s !
*/
void s_init( struct s** inst );
```
```c
/* file.c */
struct s { int x; }
// Мы знаем внутреннее устройство структуры поэтому можем обращаться к её полям
bool s_is_good( struct s* some_struct ) {
return x > 0;
}
```
Только в `file.c` можно работать с полями структуры `struct s`. В других файлах нельзя:
- Создавать переменные типа `struct s`;
- Принимать такую структуру как аргумент функции или возвращать эту структуру по значению из функций.
# Преимущества
- Инкапсуляция: можно как угодно менять порядок полей и их количество, остальная часть программы не заметит этого. Её даже можно не перекомпилировать! Особенно удобно для библиотек.
# Недостатки
- Дополнительный уровень косвенности, надо обращаться по указателю, может плохо сказаться на производительности,
- Неудобство. Например, `init` методы вынуждены принимать указатель на указатель:
```c
/* не файл file.c */
...
struct s* variable = NULL;
s_init( &s ); // теперь s указывает на инициализированный экземпляр структуры struct s
```
\ No newline at end of file
Clone repository
  • Home
  • Opaque types
  • typedef и структурные типы
  • Правила стиля написания программ на C