Понимание структуры в TCL C API - PullRequest
2 голосов
/ 20 января 2012

Наткнулся на следующую структуру, которая определена в tcl.h, API языка C для Tcl.

typedef struct {
char *result;
Tcl_FreeProc *freeProc;
int errorLine;
} Tcl_Interp;

typedef void Tcl_FreeProc(char *blockPtr); 

В документации они упомянули следующее о полях членов структуры:

Поле результата указывает на строку, которая представляет результат или сообщение об ошибке, а поле freeProc сообщает, как утилизировать хранилище для строки, когда она больше не нужна.

Аргумент Tcl_SetResult freeProc указывает, как система Tcl должна управлять хранилищем для аргумента результата. Если Tcl_SetResult или Tcl_SetObjResult вызываются в тот момент, когда interp содержит строковый результат, они делают все необходимое для удаления старого строкового результата.

freeProc может принимать три основных значения: TCL_STATIC, TCL_DYNAMIC или TCL_VOLATILE.

Если freeProc не является одним из значений TCL_STATIC, TCL_DYNAMIC и TCL_VOLATILE, то это адрес процедуры, которую Tcl должен вызвать для освобождения строки. Это позволяет приложениям использовать нестандартные распределители памяти.

Поля определены в заголовке tcl.h:

#define TCL_VOLATILE ((Tcl_FreeProc *) -1)
#define TCL_STATIC   ((Tcl_FreeProc *) 0)
#define TCL_DYNAMIC  ((Tcl_FreeProc *) free)

Я не могу понять, как они определили три значения. Разве это не должен быть указатель на функцию с void return и одним аргументом char *? как он может принимать значения, такие как 0 и -1?

1 Ответ

2 голосов
/ 20 января 2012

Tcl_FreeProc является указателем, в качестве указателя ему может быть присвоено любое значение.

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

РЕДАКТИРОВАТЬ: перефразировал его для Криса.

...