这听起来正是Tcl/Tk的设计目的。它有一个非常简单的 C API,允许您使用回调注册命令。如果您在 Tcl 程序中使用该命令,它将调用回调并提供一种机制来在 Tcl 列表(本机数据结构)和 ARGV 样式的 char* 数组之间转换参数。
它专门设计用于轻松将这种包装器改进为命令行驱动的 C 程序。您还可以使用多种其他模式来连接解释器,并且很容易作为脚本语言嵌入到程序中。从内存中,可用的接口机制是:
- 在 Tcl 解释器中注册命令
- 在您的程序中嵌入 Tcl 解释器并将 Tcl 用作嵌入式脚本语言(可能包括命令注册和程序回调)
- 使用全双工管道生成一个进程并通过标准输入/标准输出发送命令(您还可以将事件处理程序附加到数据可用时调用的管道)
- 较少的 Tcl 特定机制,例如 fork/exec 或通过套接字连接。
Ousterhout 的书Tcl and the TK Toolkit有点过时,但对 C API 有很好的指导。Welch's Practical Programming in Tcl/Tk是另一本经典的 Tcl/Tk 书籍,更新更频繁。互联网上还有其他几本书和相当多的电子资源。一些好的起点是:Tcl 教程、TK 教程、Tcl 倡导站点(可能值得仔细阅读以帮助您决定是否要走这条路)、Tcl/Tk Wiki,当然还有Stackoverflow。
TK 会给你一个简单的图形用户界面,并且很容易学习编程——如果有点简单的话。如果您花一些时间来调整外观或使用诸如Tile之类的主题引擎,它就不像以前那么难看了。
正如 Norman Ramsey指出的 (+1),另一个使用简单 C API 的替代方案是Lua。 两者都有优点和缺点。Tcl 的主要优势是简单和干净集成的 TK 工具包以及来自第三方库(例如Tix)的良好、成熟的支持支持。Lua 的主要优势在于语言要好得多,但没有标准的 GUI 工具包,因此 UI 没有那么好集成。Lua 对解释器中的线程也有更好的支持,从一开始就是为此而设计的。但是,如果您正在包装一个遗留的 C/unix 应用程序,这不太可能是一个重要的特性。
WXWidgets 比 TK 复杂得多,并且承载更多运行时包袱,但具有更丰富的功能集。
如果你有真正的理由认为你的脚本项目会发展成一个更大的应用程序,你可能会考虑 Lua。然而,在更大的范围内,您将进入一个实质性的开发项目,Python或Ruby开始成为可行的选择。随着项目变得越来越大,C 代码库将占整个项目的一小部分,第三方库支持将成为更大的考虑因素。
如果您使用 Tcl 并发现您的项目获得了自己的生命,请考虑嵌入 Tcl 解释器并将应用程序重新转换为插件 API,人们可以将自己的脚本挂接到其中。额外的功能可以作为脚本完成,并且可能会交给第三方进行维护。具有内置脚本语言的系统的优点之一是您个人不必实现功能。人们可以用脚本语言编写自己的扩展或让第三方为他们做。
SWIG 旨在生成围绕库的包装器。它解析头文件并生成一个粘合层,以目标语言呈现本机 API。要使用它,您必须将程序重构为库。