Наткнулся на следующую структуру, которая определена в 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?