TLS=thread-local storage

GLDEF_C:
    声明E32Dll为主要dll的入口点,本身没有特定含义。实质上它也是导出性质的,虽然没有显式的声明为EXPORT_C,该E32Dll()的主要做用是用来分配TLS。

EXPORT_C:
    说明NewApplication是被导出的函数,以便其他程序可以调用该函数。主要是系统框架会调用它。

两段构造:
    NewL/NewLC和ConstructL用于完成两步构造。所谓两段构造,是Symbian里面引入的一个概念,因为C++的构造函数和析构函数如果失败,是不允许抛出异常的,如果直接把大量的初始化代码放在构造函数里的话,会使得构造函数失败的几率增加,一旦构造失败,就很难对构造过程中半途而废的“烂尾楼”进行收拾,Symbian提出的两步构造就是把所有可能导致失败的代码全部移出构造函数,放在成员函数ConstructL()里进行,在构造函数执行完毕后再调用该ConstructL完成后续构造动作,以保证构造函数绝对不会失败,这一过程称为“两步构造”。与此相关,Symbian的一些类经常添加了一对函数:NewL和NewLC,来实现两步构造,这两个函数被声明为static的,回忆C++的语法定义,static成员函数实际上是独立于类之外的,它们可以在类的任何一个实例存在之前被调用,因此Symbian中往往用显式调用这两个函数的办法来创建类的实例,我们结合代码代码,看看两段构造的具体实现:

CHelloWorldDocument* CHelloWorldDocument::NewL(CEikApplication& aApp)
{
CHelloWorldDocument* self = NewLC(aApp);
//构造过程成功,把指针从Cleanup Stack中弹出,因为已无保护必要
CleanupStack::Pop(self); 
return self;
}
CHelloWorldDocument* CHelloWorldDocument::NewLC(CEikApplication& aApp)
{
CHelloWorldDocument* self = new (ELeave) CHelloWorldDocument(aApp); //第一步构造
//self指向一个构造了一半的实例,将其推入Cleanup Stack,防止后续构造失败
CleanupStack::PushL(self); 
self->ConstructL(); //第二步构造
return self;
}