基于Tcl_CreateCommand
或Tcl_CreateObjCommand
#include <tcl.h>
#include<iostream>
#include <string>
#include <mutex>
using namespace std;
char* myCppcmd() {
return "This is return string.";
}
int MyTclCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char*
argv[]) {
if (argc != 1) {
return TCL_ERROR;
}
char* res = myCppcmd();
Tcl_SetResult(interp, res, TCL_VOLATILE);
// TCL相关手册里建议使用Tcl_AppendResult替换Tcl_SetResult
return TCL_OK;
}
int main(){
string input;
Tcl_Interp* interp = Tcl_CreateInterp();
Tcl_CreateCommand(interp, "mycmd", MyTclCmd, NULL, NULL);
while(true) {
cout << " % ";
getline(cin, input);
if(input=="exit") break;
Tcl_Eval(interp, input.c_str());
cout << Tcl_GetStringResult(interp) << endl;
}
return 0;
}
制作Tcl可加载的库
#include <iostream>
#include <tcl.h>
#include <string.h>
int MyTclCommand(ClientData clientData, Tcl_Interp *interp, int argc, const char* argv[]) {
if (argc != 2) {
Tcl_Obj* objv[1];
Tcl_WrongNumArgs(interp, 0, objv, "one arg");
return TCL_ERROR;
}
char* res = "abc123";
Tcl_SetResult(interp, res, TCL_VOLATILE);
return TCL_OK;
}
extern "C" int Test_Init(Tcl_Interp *interp) {
if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) {
return TCL_ERROR;
}
if (Tcl_CreateCommand(interp, "mycmd", MyTclCommand, NULL, NULL) == NULL) {
return TCL_ERROR;
}
return TCL_OK;
}
// 可以在TCL解析器中使用 load test.so加载动态库。注意:这里制作的动态库名字必须和初始化函数名一致,即Test_init对应库名test.so