为了测试目的,我需要在Tcl和C之间共享一些定义。是否可以在Tcl脚本中包含C风格的包含文件?任何其他建议都会受到欢迎,但我不想为C头文件编写解析器。如何共享c和tcl之间的通用定义
回答
SWIG支持Tcl,因此您可以使用它。我还记得在Tcl wiki上看到一些解析C头文件的代码 - 所以你可以试着看看那里的Parsing C页面。这应该可以让你从头开始编写一个。
如果你正在做一个完整的任何复杂的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接口;我认为这很好。但是,我认为这不太可能对你想要做的事情有用。
如果您正在考虑集成结构或函数定义,那么一定要看看SWIG。不幸的是,您可能需要在SWIG生成的界面上添加额外的Tcl代码。 (例如,SWIG不会将实际标志集合中的整数转换为自然Tcl等价物,标志词列表)。 – 2012-03-25 20:09:37
谢谢,我只需要共享定义,因此可能您的suggetion和解析示例将足够好。 – Ilya 2012-03-26 09:53:43
- 1. 如何在Java和C之间共享类定义#
- 2. 在C Shell和TCL之间共享变量
- 3. lua和C之间共享数组
- 4. 在PowerShell和C#之间共享变量
- 5. 在C++和QML之间共享(Q)WebChannel
- 6. 共享Silverlight和.NET之间
- 7. C头文件的Java等价物 - 如何在类之间共享定义
- 8. 如何在自定义Ant任务之间共享数据?
- 9. 在Android中如何在自定义视图之间共享attrs
- 10. 应用程序之间共享在C#
- 11. 应用程序和共享会话之间的共享DLL
- 12. 如何通过YAML在Ruby和Bash之间共享数据?
- 13. 如何在C#和JavaScript之间共享变量?
- 14. 如何在C++和Lua之间共享数据?
- 15. 在Winforms和Webforms之间共享自定义数据源
- 16. Windows 7上的C和C $共享名称之间的区别
- 17. c# - Winform和aspx应用程序之间的共享类
- 18. 在C和C++库之间共享一个变量的困境
- 19. .exe和.dll之间的共享配置
- 20. asmx和wcf之间的共享代码
- 21. WebView和HTTPClient之间的共享Cookie?
- 22. 如何在C++和C#之间共享一个大的字节数组
- 23. 如何在共享上下文之间共享RSpec让变量?
- 24. C++ - 在线程之间共享数据
- 25. c文件之间共享变量
- 26. 在窗体c之间共享数据#
- 27. 在类C++之间共享变量?
- 28. 重用mri ruby和jruby之间的共享/绑定?
- 29. 通过不同线程之间的(C++)openmp共享信息
- 30. 如何在iPhone之间共享数据?
发现在另一个地方:“Tcl有它自己的优秀的C代码接口,我建议只研究它,而不是浪费时间在SWIG上。”但是还没有找到任何东西,所以我仍然有一些希望#include喜欢的语法,我只是找不到,在我的生活中从来没有使用tcl :)将调查一些更多... – Ilya 2012-03-25 10:57:39
这是指Tcl扩展到外部库的易用性。它很容易扩展tcl,但你说你只是想分享一些定义。由于C是严格的,你需要实现.h文件的一些基本解析 - 可能只需要正则表达式匹配即可。如果你想要一个完整的接口,从Tcl调用DLL方法 - 那么你应该写一个扩展。 – patthoyts 2012-03-25 11:38:09
谢谢,会尽力去做。 – Ilya 2012-03-25 13:03:22