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);
int appInitProc(Tcl_Interp *interp){
std::cout<<"App Init"<<std::endl;
Tcl_Init(interp);
Tk_Init(interp);
Tk_Window topwin = Tk_MainWindow(interp);
Tk_SetAppName(topwin,"NOYESNO");
Tcl_Eval(interp,"wm title . NOYESNO");
//Tcl_EvalFile(interp,"debug.tcl");
return 0;
}
int main(int argc, char** argv){
Tk_Main(argc, argv, appInitProc);
//Tk_MainLoop();
return 0;
}
实际应用中常主要的问题是初始化。包括下面几项任务
设置环境变量 TCL_LIBRARY 和 TK_LIBRARY
这两个变量是用于帮助定位 init.tcl 和 tk.tcl
方法一:
const char *argv0 = Tcl_GetNameOfExecutable();
char exec_dir[255];
strcpy(exec_dir,argv0);
char *pos = strrchr(exec_dir,'/');
*pos = '\0';
char buf[255];
sprintf(buf,"TCL_LIBRARY=%s/lib/tcl8.5",exec_dir);
putenv(buf);
方法二:
const char *argv0 = Tcl_GetNameOfExecutable();
const char *tcl_init =
"set t [file dirname [info nameofexecutable]] \n"
"set env(TCL_LIBRARY) [file join $t lib tcl8.5] \n"
"set env(TK_LIBRARY) [file join $t lib tk8.5] \n"
"unset t"
;
if (Tcl_Eval(interp,tcl_init) != TCL_OK){
return TCL_ERROR;
}
应该说还是第一种方法作为C/C++程序来说更纯粹些。
设置默认字符编码
Tcl_SetSystemEncoding(interp,"utf-8");
Tcl_SetDefaultEncodingDir("/some/path/lib/tcl8.5/encoding");
执行初始化脚本
const char *nyno_init_file = "noyesno.tcl";
if(access(nyno_init_file,R_OK) == 0){
Tcl_EvalFile(interp,nyno_init_file);
}
参考资源
Embedding vs. Extending
How to embed Tcl in C applications
分享到:
相关推荐
在Windows环境下,虽然MinGW和Insight可能不如Visual Studio等IDE直观,但它们提供了更多底层控制和灵活性,特别适合对C和C++代码进行深度调试。 总的来说,结合MinGW提供的GDB和Insight的可视化界面,Windows用户...
2. **Tcl/Tk编程**:Tcl是一种脚本语言,Tk是其图形用户界面(GUI)工具包。这部分内容包括了Tcl的基础和高级主题,以及Tk的基本用法和第二部分的深入探讨。此外,还介绍了使用[T Incr] Tcl进行面向对象编程的方法,...
**安装图形界面**: 如果需要使用图形界面,可以在安装过程中同时安装`tcltk`库,并且安装`insight`作为图形界面调试工具。 #### 二、GDB常用命令 1. **启动调试**: 在Cygwin或Xwin终端输入`gdb ns`进入调试模式。 ...
wangtengfei-hn_EmployeesExample_23540_1745868671962
scratch少儿编程逻辑思维游戏源码-汽车冲突.zip
scratch少儿编程逻辑思维游戏源码-棱镜.zip
少儿编程scratch项目源代码文件案例素材-直升机坠毁.zip
输入法优化与定制_五笔编码编辑与词库管理_Rime输入法引擎与86极点码表_跨平台五笔码表编辑器工具_for_macOS与Windows系统_支持用户自定义词条添加删除与排序_提供
少儿编程scratch项目源代码文件案例素材-主题乐园大亨.zip
scratch少儿编程逻辑思维游戏源码-迷失在像素平原.zip
少儿编程scratch项目源代码文件案例素材-纸格通关 云变量.zip
wanjunshe_Python-Tensorflow_12888_1745868924470
scratch少儿编程逻辑思维游戏源码-深入海底.zip
驾校自动化_网页自动化爬虫技术_Python27多线程HTTP请求模拟_龙泉驾校2014版约车系统自动预约助手_通过模拟登录和循环请求实现自动约车功能_支持失败自动递增车号重试_
scratch少儿编程逻辑思维游戏源码-南瓜危机.zip
scratch少儿编程逻辑思维游戏源码-皮博冒险者.zip
基于c++开发的网络嗅探器,重点对TCP、UDP、ARP、IGMP、ICMP 等数据包进行分析,实现捕捉前过滤、数据包统计、流量统计等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于c++开发的网络嗅探器,重点对TCP、UDP、ARP、IGMP、ICMP 等数据包进行分析,实现捕捉前过滤、数据包统计、流量统计等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于c++开发的网络嗅探器,重点对TCP、UDP、ARP、IGMP、ICMP 等数据包进行分析,实现捕捉前过滤、数据包统计、流量统计等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于c++开发的网络嗅探器,重点对TCP、UDP、ARP、IGMP、ICMP 等数据包进行分析,实现捕捉前过滤、数据包统计、流量统计等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于c++开发的网络嗅探器,重点对TCP、UDP、ARP、IGMP、ICMP 等数据包进行分析,实现捕捉前过滤、数据包统计、流量统计等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档
用于释放电脑的内存,很好用。
scratch少儿编程逻辑思维游戏源码-气球足球.zip
ollama 0.6.6.0官网下载,不方便的可以从这里下载