Pogledajte određenu poruku
Staro 21. 11. 2008.   #3
filmil
хардвераш
Qualified
 
Datum učlanjenja: 04.01.2007
Lokacija: Маунтин Вју, САД
Poruke: 117
Hvala: 4
25 "Hvala" u 10 poruka
filmil is on a distinguished road
Default

Citat:
Originalno napisao forrest13yu Pogledajte poruku
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) попуњава структуру са поинтерима на функције које изводе стандардне операције над датотекама. Пример како то изгледа у линуксовом кернелу.

ф
__________________
Рад је створио човека. Рад ће га и уништити.
filmil je offline   Odgovorite uz citat
"Hvala" filmil za poruku: