如何在c和tcl之间共享通用定义

时间:2012-03-25 10:34:17

标签: c automated-tests tcl

出于测试目的,我需要在Tcl和C之间共享一些定义。是否可以在Tcl脚本中包含C样式包含文件?任何替代建议都会受到欢迎,但我不想为C头文件编写解析器。

2 个答案:

答案 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接口;我觉得这很棒。但是,我认为它不会对你想要做的事情有用。