使用 ooc/介面進行程式設計
ooc 的一個強項是它對 C 庫的描述性介面方式。這些介面可以像 extern 函式列表一樣低階,也可以透過將函式呼叫和資料封裝在 ooc 類或複雜的覆蓋層中而變得“高階”。
在接下來的討論中,我們將構建一個對 libYAML (http://pyyaml.org/wiki/LibYAML) 庫的基本介面。nddrylliog 已經建立了一個現有介面 在這裡,我們將把它作為參考。
我們的大部分工作將涉及讀取庫標頭檔案 (http://svn.pyyaml.org/libyaml/branches/stable/include/yaml.h) 以及決定如何使用其中的內容。要與 C 庫進行介面,我們需要它存在於我們的系統中。我們還希望為我們的新介面建立一個檔案層次結構。
在本節中,我們將使 C 庫對我們的新 ooc 介面可見,併為該介面建立檔案層次結構。
安裝(使 C 庫可用)是與系統相關的。以下步驟適用於 Ubuntu 使用者
sudo apt-get install libyaml-dev
另一個選項(這實際上超出了本書的範圍)是在使用者帳戶內保留庫,並控制 C 編譯器搜尋庫和標頭檔案的路徑。使用 ~/local 作為字首的示例設定可能是
mkdir ~/local
cd ~/local
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar -xzvf yaml-0.1.4.tar.gz
cd yaml-0.1.4
./configure --prefix=[absolute path to ~/local]
make
make install
要利用這種設定,您需要在相關的使用者 rc 檔案中設定相關的環境變數
export PATH=$HOME/local/bin:$PATH
export LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$HOME/local/include:$C_INCLUDE_PATH
要使用 ooc 中的庫,約定是設定環境變數 OOC_LIBS。與上面討論的本地設定保持一致,這可以是僅對該使用者可見的路徑
export OOC_LIBS=$HOME/local/ooc_libs
由於我們自己正在構建一個 ooc 庫,因此檔案層次結構屬於 OOC_LIBS 內部。關於庫結構和相關 use 檔案的更多詳細資訊可以在 ooc 文件中找到。為了我們的目的,我們會有類似的東西
ooc-yaml
yaml.use
source
YAML.ooc
samples
01-test.occ
第一步是建立一個 use 檔案,該檔案描述了 ooc 庫的佈局以及編譯到想要使用它的 ooc 程式所需的設定。一個基本的設定如下
Name: libYAML Version: 0.1.4 Description: Interface to libYAML Includes: yaml.h SourcePath: source
為了這次討論的目的,我們將在上面檔案層次結構的 source/YAML.ooc 內完成所有介面建立。因為我們希望這個檔案包含我們上面建立的設定,所以我們在該檔案的頂部包含以下行
use yaml
在該檔案的頂部。
奇怪的是,libYAML 似乎沒有定義任何常量!但以防您所連線的庫確實包含常量,您的介面應該看起來像這樣(上面以粗體顯示的 C 程式碼,下面是 ooc)
#define A_FLOATING_POINT_CONSTANT 12.0 OOC_NAME_FOR_FLOATING_POINT_CONSTANT: extern( A_FLOATING_POINT_CONSTANT ) Float
#define A_STRING_CONSTANT "Twelve" OOC_NAME_FOR_STRING_CONSTANT: extern( A_STRING_CONSTANT ) CString
與 C 標頭檔案連線意味著與 C 預處理器的許多奇怪部分以及開發人員用來跨平臺和程式設計正規化的技巧接觸。libYAML 使用宏 YAML_DECLARE 來提供與 WIN32 的互操作性。為了我們的目的,我們將簡單地擴充套件: #define YAML_DECLARE(type) type 這使得以下宣告等效
YAML_DECLARE(const char *) yaml_get_version_string(void);
const char * yaml_get_version_string(void); YAMLGetVersionString: extern( yaml_get_version_string ) func() -> CString