爲了測試目的,我需要在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