c++/c内部调用TCL

来源:互联网 发布:数据挖掘待遇 编辑:程序博客网 时间:2024/06/07 15:57

TCL提供了C语言的调用接口,可以很容易地嵌入到C程序中;由于TCL提供了与C的接口函数,所以可以在C编写的应用中调用TCL的库函数,执行TCL的命令或脚本。具体的工作有:
    ①创建TCL的解释器;    
    ②执行TCL的命令或脚本;
    ③对返回代码进行处理;
    ④撤消TCL的解释器。

一、test.c代码

#include <tcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
Tcl_Interp *interp;
int
PowObjCmd(ClientData clientData, Tcl_Interp *interp,
          int objc, Tcl_Obj *CONST objv[])
{
        Tcl_Obj  *resultptr;
        double    x,y,result;
        int       error;

        if (objc != 3) {
            Tcl_WrongNumArgs(interp,2,objv,
                           "Usage : pow x y");
            return TCL_ERROR;
        }
        error = Tcl_GetDoubleFromObj(interp, objv[1], &x);
        if (error != TCL_OK) return error;
        error = Tcl_GetDoubleFromObj(interp, objv[2], &y);
        if (error != TCL_OK) return error;

        result = pow(x,y);
        resultptr = Tcl_GetObjResult(interp);
        Tcl_SetDoubleObj(resultptr,result);
        return TCL_OK;
}
int
Example_Init() {
        interp = Tcl_CreateInterp();
        if(interp == NULL)
        {
            return 1;
        }
        Tcl_CreateObjCommand(interp, "pow", PowObjCmd,
                (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
        return TCL_OK;
}
int main()
{
    int ret;
    Example_Init();
    ret = Tcl_EvalFile(interp,"test.tcl");
    if(ret == TCL_ERROR)
    {
        printf("Tcl script error:%s",interp->result);
        //DataLog::insertERROR(logdata);
    }
    printf("ok %d\n",ret);
    return 0;
}

二、makefile

t = libtest
TCL_LIBS = -L/usr/lib/libtcl8.5.so
all: $t
clean:
    rm -f $t core
libtest: test.c
    g++ -I. ${TCL_LIBS} -o $@ test.c -ltcl -ltk -fPIC

三、test.tcl

pow 2 5

0 0