[英]how to share common definition between c and tcl
出於測試目的,我需要在Tcl和C之間共享一些定義。是否可以在Tcl腳本中包含C樣式包含文件? 任何替代建議都會受到歡迎,但我不想為C頭文件編寫解析器。
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
語句#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接口; 我覺得這很棒。 但是,我認為它不會對你想要做的事情有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.