Citat:
Originalno napisao forrest13yu
typedef struct d2fctx d2fctx;
|
Дефинише нови тип, који се зове d2fctx, а који је представљен структуром која има истоимену ознаку (tag) struct d2fctx.
Citat:
typedef dvoid *(* d2fmalc) (d2fctx *context, size_t size);
|
Дефинише нови тип који се зове d2fmalc, а који представља:
- поинтер на функцију
- која као параметре узима:
-- поинтер по имену context на претходно дефинисан тип d2fctx,
-- ознаку за величину типа size_t.
- и враћа поинтер на тип dvoid.
Citat:
typedef dvoid *(* d2fmrlc) (d2fctx *context, dvoid *ptr, size_t newsize);
|
Дефинише нови тип који се зове d2fmrlc, а који представља:
- поинтер на функцију
- која као параметре узима:
-- поинтер по имену context на претходно дефинисан тип d2fctx,
-- поинтер по имену ptr на тип dvoid.
-- ознаку по имену newsize за величину типа size_t.
- и враћа поинтер на тип dvoid.
Citat:
typedef void (* d2fmfre) (d2fctx *context, dvoid *ptr);
|
Дефинише нови тип који се зове d2fmfre, а који представља:
- поинтер на функцију
- која као параметре узима:
-- поинтер по имену context на претходно дефинисан тип d2fctx,
-- поинтер по имену ptr на тип dvoid.
- и враћа поинтер на тип dvoid.
Citat:
struct d2fctx
{
dvoid *pidgc_d2fctx; /* Builder context */
dvoid *cdata_d2fctx; /* Client Data */
d2fmalc d2fmalc_d2fctx; /* Client provided malloc */
d2fmfre d2fmfre_d2fctx; /* Client provided free */
d2fmrlc d2fmrlc_d2fctx; /* Client provieded realloc */
};
|
Ово је структура у којој се налазе два поинтера на тип dvoid на некакве „контексте“, и три поинтера на функције, типова дефинисаних у декларацијама изнад.
Ово је несрећни цеовски начин за нешто што се у објектно-оријентисаним језицима зове убризгавање зависности („dependency injection“) и представља начин да се бибилиотеци проследе корисничке функције.
У објектно оријентисаним језицима би се овај исти проблем решио наслеђивањем или убризгавањем зависности. У јави на пример, горепоменута структура постала би интерфејс (interface), а кориснички код би имплементирао (implement) тај интерфејс и преиначио (overload) функције по жељи.
Познатији пример употребе сличног механизма у Ц-у су униксове операције са датотекама — сваки систем датотека (filesystem) попуњава структуру са поинтерима на функције које изводе стандардне операције над датотекама.
Пример како то изгледа у линуксовом кернелу.
ф