2012-03-25 89 views
0

为了测试目的,我需要在Tcl和C之间共享一些定义。是否可以在Tcl脚本中包含C风格的包含文件?任何其他建议都会受到欢迎,但我不想为C头文件编写解析器。如何共享c和tcl之间的通用定义

回答

2

SWIG支持Tcl,因此您可以使用它。我还记得在Tcl wiki上看到一些解析C头文件的代码 - 所以你可以试着看看那里的Parsing C页面。这应该可以让你从头开始编写一个。

+0

发现在另一个地方:“Tcl有它自己的优秀的C代码接口,我建议只研究它,而不是浪费时间在SWIG上。”但是还没有找到任何东西,所以我仍然有一些希望#include喜欢的语法,我只是找不到,在我的生活中从来没有使用tcl :)将调查一些更多... – Ilya 2012-03-25 10:57:39

+0

这是指Tcl扩展到外部库的易用性。它很容易扩展tcl,但你说你只是想分享一些定义。由于C是严格的,你需要实现.h文件的一些基本解析 - 可能只需要正则表达式匹配即可。如果你想要一个完整的接口,从Tcl调用DLL方法 - 那么你应该写一个扩展。 – patthoyts 2012-03-25 11:38:09

+0

谢谢,会尽力去做。 – Ilya 2012-03-25 13:03:22

0

如果你正在做一个完整的任何复杂的API,那么你最好使用SWIG(或者批注:)来进行绑定。 SWIG可以在很少的用户输入(通常几乎没有)的情况下在C API和Tcl之间进行绑定。应该指出,虽然从Tcl的角度来看它生成的API并不是很自然(因为Tcl 不是 C,并且有不同的习语)。

然而,如果你是后处理只是定义最简单的部分某种程度上代替 - 只是#define•数字常量 - 再处理是通过位正则表达式解析最简单的方法:

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绑定的不同方式,它通过在Tcl中嵌入C语言来工作。它可以产生非常自然的C代码的Tcl接口;我认为这很好。但是,我认为这不太可能对你想要做的事情有用。

+0

如果您正在考虑集成结构或函数定义,那么一定要看看SWIG。不幸的是,您可能需要在SWIG生成的界面上添加额外的Tcl代码。 (例如,SWIG不会将实际标志集合中的整数转换为自然Tcl等价物,标志词列表)。 – 2012-03-25 20:09:37

+0

谢谢,我只需要共享定义,因此可能您的suggetion和解析示例将足够好。 – Ilya 2012-03-26 09:53:43