• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Tcl/TkC/C++扩展

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Tcl 作为一种脚本语言,有其优点,因而在C/C++程序中加入执行Tcl脚本的能力,可以提供脚本。 
Tcl 作为一种脚本语言,终有其局限性。比如速度和某些功能。在Tcl中调用 C/C++ 使得 Tcl 可以扩展。 

Tcl/Tk 和 C/C++ 的关系可以概括为三种情况: 

    在C/C++程序里面执行 Tcl 语句。 (Tcl Interpreter) 
    在 Tcl 中调用 C/C++ 实现的功能。 (Tcl Package) 
    C/C++程序本身是基于 Tcl/Tk 的程序。(Big Wish) 

在C/C++程序里面执行 Tcl 语句 (Tcl Interpreter) 

    Adding Tcl/Tk to a C application 

由于Tcl语言是解释器执行语言,可以想象问题的关键是知道解释器对象和要执行得Tcl语句。 
Tcl解释器(Tcl Interpreter)的创建和管理 

// 创建一个解释器 
Tcl_Interp *interp = Tcl_CreateInterp(); 

// 执行"init.tcl"进行初始化 
if ( Tcl_Init( interp ) != TCL_OK ) { 
     // Error 
} 

if(Tcl_InterpDeleted(interp) != 0){ 
  // 解释器 已经被删除了 
} 

// 通过解释器来使用Tcl 
const char *script = "set t 3 ; puts $t"; 
Tcl_Eval(interp,script ); 
// 删除这个解释器 
Tcl_DeleteInterp(interp); 

Tcl解释器中命令的执行 

/* 执行一段命令, 命令内容保存在 objPtr 中 */ 
int Tcl_EvalObjEx(Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); 
/************************************************ 
* 第一次执行时,命令会被编译成字节码 
***********************************************/ 

/* 执行一个文件, 相对于 source 语句 */ 
int Tcl_EvalFile(Tcl_Interp *interp, const char *fileName); 

/* 执行一段命令, 命令内容保存在字符串中 */ 
int Tcl_Eval(Tcl_Interp *interp, const char *script ); 
int Tcl_EvalEx(Tcl_Interp *interp, const char *script, int numBytes, int flags); 
/************************************************ 
* 直接解析执行,不会编译成字节码 
***********************************************/ 
/* 执行一条命令 */ 
int Tcl_EvalObjv(Tcl_Interp *interp, int objc, Tcl_Obj **objv, int flags); 

在 Tcl 中调用 C/C++ 实现的功能 (Tcl Package) 

这个常用于扩展包。 

在Tcl中读入编译好的C/C++程序模块(.so 文件或者.dll文件)。 

    Tcl 通过命令 load 加载编译好的程序模块 

    load filename.so pkgName 
    # Tcl解释器将会调用C/C++ 模块种特定的函数(pkgName_Init/pkgName_SafeInit) 作为程序入口。 
    # 该入口函数通常用来添加Tcl命令。 

    # 默认是读入当前的解释器。也可以指定解释器如下 
    load filename.so pkgName interp 

    C/C++ 

    /************************************************ 
    * 以下两者之一是函数原型 
    * 后者用于safe intepreter 
    *************************************************/ 
    int pkgName_Init(Tcl_Interp *interp); 
    int pkgName_SafeInit(Tcl_Interp *interp); 

    //e.g. 
    int pkgName_Init(Tcl_Interp *interp){ 

    } 

    关于如何在C中创建新的Tcl命令,稍后介绍。 

C/C++程序本身是基于 Tcl/Tk 的程序 

这种程序的好处是,在拥有C的强大计算能力的同时,提供给用户一个交互式界面。 
如果加上Tk,还可以实现GUI。这样的程序有时也被称作 //bigwish// 

    Hello World 程序。执行起来就像是一个Tcl Shell。 

#include <tk.h> 
#include <tcl.h> 
#include <iostream> 

typedef int Tcl_AppInitProc(Tcl_Interp *interp);


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#各种数据库连接字符串发布时间:2022-07-13
下一篇:
C#大端与小端发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap