NS:嵌入的Tcl

~ns/tcl/目錄下存放着 NS 各種構件的 Otcl 代碼以及很多初始配置腳本。NS剛一開始運行,這些 Otcl 腳本所定義的類、過程和變量就都是有效的了。 NS 實際上是通過EmbeddedTcl 類將一些初始 Otcl 腳本載入 NS 的。

      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

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章