出于测试目的,我需要在Tcl和C之间共享一些定义。是否可以在Tcl脚本中包含C样式包含文件?任何替代建议都会受到欢迎,但我不想为C头文件编写解析器。
答案 0 :(得分:2)
SWIG支持Tcl,所以你可以利用它。另外我记得看到一些代码来解析Tcl wiki上的C头 - 所以你可以尝试查看那里的Parsing C页面。这应该可以让你从头开始写一篇文章。
答案 1 :(得分:0)
如果您正在使用任何复杂性的完整API,最好使用SWIG(或critcl †)来进行绑定。 SWIG可以在很少的用户输入(通常几乎没有)的情况下在C API和Tcl之间进行绑定。应该注意的是,从Tcl的角度来看,它产生的API并不是很自然(因为Tcl 不是 C并且有不同的习语)。
然而,如果您只是在某种方式处理定义的最简单部分 - 只是#define
的数字常量 - 那么最简单的处理方法是通过一些正则表达式解析:< / p>
proc getDefsFromIncludeFile {filename} {
set defs {}
set f [open $filename]
foreach line [split [read $f] "\n"] {
# Doesn't handle all edge cases, but does do a decent job
if {[regexp {^\s*#\s*define\s+(\w+)\s+([^\s\\]+)} $line -> def val]} {
lappend defs $def [string trim $val "()"]
}
}
close $f
return $defs
}
它在Tcl自己的标题上做了相当可信的工作。 (处理条件定义和嵌套的#include
语句留作练习;我建议你尝试安排你的C头,以便不需要这个练习。)当我这样做时,提取的前几个定义是:
TCL_ALPHA_RELEASE 0 TCL_BETA_RELEASE 1 TCL_FINAL_RELEASE 2 TCL_MAJOR_VERSION 8
† Critcl是一种不同的Tcl / C绑定方式,它通过在Ccl中嵌入C语言来工作。它可以为C代码生成非常自然的Tcl接口;我觉得这很棒。但是,我认为它不会对你想要做的事情有用。