跳轉到內容

使用 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

結構體

[編輯 | 編輯原始碼]

使用介面

[編輯 | 編輯原始碼]

使介面對其他人可見

[編輯 | 編輯原始碼]

提交一個 sam 食譜

[編輯 | 編輯原始碼]
華夏公益教科書