EmbeddedTcl 類是在~tclcl/tclcl.h 和~tclcl/Tcl.cc 中定義的。
tclcl.h 中EmbeddedTcl 的類聲明:
class EmbeddedTcl {
public:
inline EmbeddedTcl(const char* code) { code_ = code; }
void load();
int load(Tcl_Interp* interp);
const char* get_code() { return code_; }
private:
const char* code_;
};
除了構造函數之外就只有一個load()函數,很簡單。再看看Tcl.cc 文件中load() 的定義:
void EmbeddenTCL::load() {
Tcl::instance.evalc (code_);
}
也簡單,就是將構造函數中傳入的code_ 字符串作爲Otcl 命令執行了。
所以,類EmbeddedTcl 的作用就用來存儲和執行一段Otcl 腳本。
~ns/gen/ns_tcl.cc 中使用了EmbeddedTcl類。ns_tcl.cc 是在編譯NS 的過程中自動生成的,它可以將tcl/lib/ns-lib.tcl 中所聲明的所有Tcl腳本通過EmbeddedTcl 對象封裝,以便在NS 開始運行時載入。
所以,想要擴展NS 的Otcl 腳本,只把它放在~ns/tcl/目錄是不夠的,需要加一條source 命令在tcl/lib/ns_lib.tcl 中,以便在用Tcl_expand.tcl 擴展ns_lib.tcl 的時候能夠將該腳本的內容包含進去。然後還需要重新編譯NS,以便重新生成ns_tcl.cc。
一定要確保編譯過程中重新生成gen/ns_tcl.cc,不如Tcl 腳本的改動就不會起作用了。最好先手動刪除gen/ns_tcl.cc,這樣就肯定不會出差錯了。
ps:和ns_tcl.cc 相似的還有gen/ptypes.cc