symbian _LIT 宏的肤浅理解

系统里面_LIT宏的定义是这样的

#if defined(_UNICODE)
typedef TText16 TText;
#define _L(a) (TPtrC((const TText *)L ## a))
#define _S(a) ((const TText *)L ## a)
#define _LIT(name,s) static const TLitC<sizeof(L##s)/2> name={sizeof(L##s)/2-1,L##s}
#else
typedef TText8 TText;
#define _L(a) (TPtrC((const TText *)(a)))
#define _S(a) ((const TText *)a)
#define _LIT(name,s) static const TLitC<sizeof(s)> name={sizeof(s)-1,s}
#endif

其中L##s的意思是把字符连接起来,在c++中 L"dfsdf" 这样的形式是 大写字母L(代表「long」),这将告诉编译器该字串按宽字符保存。

_LIT 定义出来的实际上是一个static const TLitC 的对象 name

其中的 sizeof(L##s)/2-1 这里的减去1我有点不太明白,以后研究明白了补上。。。。

TLitC的定义是这样的

typedef TRefByValue<const TDesC> __TRefDesC;
template <TInt S>
class TLitC
{
public:
enum {BufferSize=S-1};
inline const TDesC* operator&() const;//这里可以返回const TDesC*
inline operator const TDesC&() const;//转成const TDesC
inline const TDesC& operator()() const;
inline operator const __TRefDesC() const;
public:
#if !defined(_UNICODE)
typedef TUint8 __TText;
#elif defined(__GCC32__)
typedef __wchar_t __TText;
#elif defined(__VC32__)
typedef TUint16 __TText;
#elif defined(__CW32__)
typedef TUint16 __TText;
#else
#error no typedef for __TText
#endif
public:
TUint iTypeLength;
__TText iBuf[__Align(S)];
};

你可能感兴趣的:(Symbian)