簡體   English   中英

如何在c和tcl之間共享通用定義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM