2014-01-24 70 views
0

我正在編寫一個C++代碼來評估一個tcl proc。我有兩個TCL文件。任何兩個可以有tcl proc 說file1.tcl有tcl proc mytest。 file2.tcl源文件file1.tcl所以如果我在[file proc mytest] file2.tcl中,我能夠得到tcl proc名稱mytest。 但在C++中,當我嘗試評估proc時,它說無效的命令mytest。 但是,如果我在file2.tcl中編寫proc mytest,它會起作用。需要從C++中的另一個文件調用tcl proc

file1.tcl是用戶輸入,file2.tcl是默認輸入。只有在file1.tcl中缺少proc時,我纔會調用file2.tcl proc。 請建議我如何得到它的工作。

感謝 魯奇

+0

如果您還沒有這樣做呢,我建議你請閱讀[堆棧溢出的問題清單(http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist )。 –

回答

1

你的問題是不完全清楚,但似乎你有兩個文件,其中一個可以控制(並提供了一些Tcl的默認實現命令?),而另一個的是由用戶控制的(這樣他們可以覆蓋的東西?)。然後你想把它們加載到Tcl解釋器上下文中,以便你可以從C++調用東西?我會認爲這是發生了什麼事。

首先,從Tcl的角度來看,通過獲取上下文(Tcl_Interp*)到source這個文件,使用默認實現。 (還有其他方法可以做到這一點,但這絕對是最簡單的方法。)只有在完成之後,您纔可以用source這個文件加上用戶定義,並且只有在已完成採購正確。所以這就是我們的目標。

從C++,要注意的主要事情是Tcl_EvalFile()source Tcl中(就像Tcl_Eval()eval等同)等同,而且你照顧與檢查錯誤; Tcl並沒有將其異常系統映射到C++異常,因此檢查那些返回碼

Tcl_Interp *interp = Tcl_CreateInterp(); 

if (Tcl_EvalFile(interp, "file2.tcl") != TCL_OK) { 
    const char *errorMessage = Tcl_GetString(Tcl_GetObjResult(interp)); 
    // Deal with error 
    cerr << "Problem in library: " << errorMessage << "\n"; 
    exit(1); 
} 

if (Tcl_EvalFile(interp, "file1.tcl") != TCL_OK) { 
    const char *errorMessage = Tcl_GetString(Tcl_GetObjResult(interp)); 
    cerr << "Problem in user code: " << errorMessage << "\n"; 
    exit(1); 
} 

// Everything ready 
if (Tcl_Eval(interp, "[the_party get] start") != TCL_OK) { 
    // Something still went wrong... 
相關問題