Symbian系統開發教程 二

2022-09-18 20:45:11 字數 2543 閱讀 9283

3.7字面量描述符(literal descriptors)

下面我們來看看字面量描述符,它相當於c語言中的static char。字面量描述符是通過一系列的巨集來建立的,這些巨集可在標頭檔案e32def.h中找到

#define _l8(a) (tptrc8((const ttext8 *)(a)))

#define _s8(a) ((const ttext8 *)a)

#define _lit8(name,s) const static tlitc8

name =

#define _l16(a) (tptrc16((const ttext16 *)l ## a))

#define _s16(a) ((const ttext16 *)l ## a)

#define _lit16(name,s) const static tlitc16

name =

首先,我們來看_lit,這是最有效率也是被使用得最多的乙個。這個巨集的用法如下:

_lit(kmyliteraldescriptor, "the quick brown fox jumps over the lazy dog");

後面kmyliteraldescriptor就可以作為乙個常量來使用,例如可以將它寫到檔案或顯示給使用者。_lit 巨集構建了乙個名為kmyliteraldescriptor的tlitc16物件,其中儲存了字串的值(在這個例子中是the quick brown fox jumps over the lazy dog),在二進位制程式中可以找到這個值,因為它是被寫到檔案中的。如您所料,_lit8和_lit16的用法相似。因為描述符的寬度為16bit,所以,在將c位元組型別的字串轉換為描述符能用的資料時,巨集將字串的長度除以2。

作為參考,下面給出類tlitc16的定義,其中__ttext被定義為寬的,16bit的字元。tlitc8

也有類似的定義。

template

class tlitc16

;template

inline const tdesc16* tlitc16::operator&() const

template

inline const tdesc16& tlitc16::operator()() const

template

inline tlitc16::operator const tdesc16&() const

從上面的定義中可以看到, tlitc16 (和tlitc8) 並不從tdesc8 或 tdesc16派生,但是它們與tbufc8 或tbufc16具有相同的記憶體布局。這就使得tlitc16 (和tlitc8)可以用在任何可以使用tdesc的地方。您也可以用如下的方法從乙個字面量構造乙個指標描述符:

tptrc8 theptr(kmyliteraldescriptor);

從字面量構造緩衝區描述符需要一點小技巧。如果您用size()去獲得_lit常量,它會返回相應的tlitc物件的尺寸大小,這個尺寸相當於描述符內容的尺寸加上額外的8個byte(用來存放長度值的4位元組和表示結束符的null)。如果您想用它來構造基於堆的描述符,必須要將這額外的8個位元組考慮進去。

// 定義乙個包含44字元的字面量

_lit8(kexamplelit8, "the quick brown fox jumped over the lazy dog");

tint size = sizeof(kexamplelit8); // 52 bytes (contents + 8 bytes)

tbufc8<(sizeof(kexamplelit8)-8)> thestackbuffer(kexamplelit8);

對基於堆的描述符,您可以用描述符實際內容的長度來分配緩衝區,然後將內容拷貝到描述符中。為了得到正確的長度,您可以用公共(public)的成員變數itypelength,或者,也可以用更簡單的方法,使用()操作符來將字面量轉換成乙個描述符,然後用這個得到的描述符來得到內容的長度。但最簡單的方法是,使用()操作符將物件轉換成描述符後,直接呼叫tdes::allocl()方法,返回乙個hbufc*,**如下:

tint descriptorlength = kexamplelit8.itypelength; // 44 bytes

// form a stack buffer descriptor around the literal

// create a heap buffer copying the contents of the literal

hbufc8* theheapbuffer = kexamplelit8().allocl();

// 對寬字元字面量的操作類似

_lit16(kexamplelit16, "the quick brown fox jumped over the lazy dog");

size = sizeof(kexamplelit16);// 96 bytes (contents in bytes + 8 bytes)

descriptorlength = kexamplelit16.itypelength; // 44 bytes (contents)

用_l 和 _lit生成的字面量,它們的記憶體布局是有差異的,如下圖所示:

Symbian系統開發教程 二

3.7字面量描述符 literal descriptors 下面我們來看看字面量描述符,它相當於c語言中的static char。字面量描述符是通過一系列的巨集來建立的,這些巨集可在標頭檔案e32def.h中找到 define l8 a tptrc8 const ttext8 a define s8...

Thinkphp實戰教程後台管理系統開發

目錄 thinkphp5 後台管理開發.png thinkphp5 後台管理開發.xmind thinkphp實戰教程後台管理系統開發 1.課程介紹及大綱.mp4 thinkphp實戰教程後台管理系統開發 2.框架基礎知識點 php基礎知識.mp4 thinkphp實戰教程後台管理系統開發 3.框架...

系統開發 系統規劃

一 系統規劃五個階段 1 專案目標和動機 2 立項價值判斷 3 專案選擇和確定 4 初步調查 5 可行性研究 包括經濟可行性,技術可行性,法律可行性,使用者使用可行性 二 可行性分析八個階段 1 複查系統目標和規模 2 分析現在系統 3 匯出新系統的高層邏輯模型 4 使用者複查 5 提出並評價解決方...