WEB开发网
开发学院手机开发Symbian 开发 Symbian开发入门 阅读

Symbian开发入门

 2010-06-03 23:07:00 来源:WEB开发网   
核心提示:TPtrC8 thePtr(KMyLiteralDescriptor);从字面量构造缓冲区描述符需要一点小技巧,如果您用size()去获得_LIT常量,Symbian开发入门(15),它会返回相应的TLitC对象的尺寸大小,这个尺寸相当于描述符内容的尺寸加上额外的8个byte(用来存放长度值的4字节和表示结束符的NUL

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生成的字面量,它们的内存布局是有差异的,如下图所示:

现在我们简单地看看 _L 和 _S 宏, 这两个宏已经过时, 但在测试代码中还经常用到。

RDebug::Print(_L("Hello world!"));

这个代码的作用相当于:

_LIT(KLit,"Hello world!");

RDebug::Print(KLit);

从上面的代码可以看到,使用_L的好处在于,您可以直接使用它,而无需在使用之前,在别的地方声明。字符串(”Hello world!”)被作为一个基本的以0结尾的字符串写到二进制文件中,它前面没有长度值(这不同于_LIT产生的字符串)。由于没有长度值,字面量的内存布局不同于描述符,并且当代码运行的时候,_L的第个实例都会产生一个临时的TPtrC,这个TPtrC的指针指向字面量的第一个字节在ROM

上一页  10 11 12 13 14 15 16 17 18 19 20  下一页

Tags:Symbian 开发 入门

编辑录入:coldstar [复制链接] [打 印]
赞助商链接