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 提出並評價解決方...