2012-03-25 93 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