In a header file of your C/C++ application or extension that includes the Tcl library, add these lines: #include ... #if ((TCL_MAJOR_VERSION < 8) || ((TCL_MAJOR_VERSION == 8) \ && (TCL_MINOR_VERSION == 0))) #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS typedef struct Tcl_SavedResult { char *result; Tcl_FreeProc *freeProc; } Tcl_SavedResult; EXTERN void Tcl_DiscardResult _ANSI_ARGS_((Tcl_SavedResult *)); EXTERN void Tcl_RestoreResult _ANSI_ARGS_((Tcl_Interp *, Tcl_SavedResult *)); EXTERN void Tcl_SaveResult _ANSI_ARGS_((Tcl_Interp *, Tcl_SavedResult *)); #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT #endif All that TCL_STORAGE_CLASS monkey business is to make sure all compilers understand that your code, not the Tcl library, will be providing the Tcl_*Result() functions. Somewhere in your program/library code, add these lines: #if ((TCL_MAJOR_VERSION < 8) || ((TCL_MAJOR_VERSION == 8) \ && (TCL_MINOR_VERSION == 0))) void Tcl_SaveResult(Tcl_Interp *interp, Tcl_SavedResult *savedPtr) { char *result = Tcl_GetStringResult(interp); if (interp->freeProc == TCL_STATIC) { /* String might go away with another Tcl_Eval() call, so make a copy. */ int length = strlen(result); savedPtr->result = Tcl_Alloc(length + 1); strcpy(savedPtr->result, result); savedPtr->freeProc = TCL_DYNAMIC; } else { savedPtr->result = result; savedPtr->freeProc = interp->freeProc; /* We've taken responsibility for savedPtr->result, so make sure the interp doesn't free it for us. */ interp->freeProc = TCL_STATIC; } Tcl_ResetResult(interp); } void Tcl_RestoreResult(Tcl_Interp *interp, Tcl_SavedResult *savedPtr) { Tcl_SetResult(interp, savedPtr->result, savedPtr->freeProc); } void Tcl_DiscardResult(Tcl_SavedResult *savedPtr) { if (savedPtr->freeProc == TCL_DYNAMIC) { Tcl_Free(savedPtr->result); } else { (*savedPtr->freeProc)(savedPtr->result); } } #endif There! Now you can call Tcl_SaveResult(), Tcl_RestoreResult(), and Tcl_DiscardResult() even if you happen to link against a pre-Tcl 8.1 library. ----- [Category Porting]