http://zeroliu.blogdriver.com/zeroliu/1266175.html
Symbian OS C++学习笔记1命名约定
------------------------------
最近学习Symbian开发,正在看人民邮电出版社的《Symbian OS C++ 高效编程》(http://www.china-pub.com/computers/common/info.asp?id=25539),英文书名为《Symbian OS Explained: Effective C++ Programming for Smartphones》
------------------------------
在书中“关于本书”部分以及第一章,主要讲述一些命名约定。在Symbian OS中开发应用程序中的常用的命名规范,比C++中更为严格。而且,这些由人为来遵守,而无法象java一样依靠编译器来保证,所以需要特别小心。以下内容参考了“Symbian入门指南-项目文件&命名规范” http://blog.csdn.net/welcome_ck/archive/2004/12/28/232327.aspx
------------------------------
1,类名
T类(如TDesc、TPoint)T类没有析构函数。它们的行为类似于内置类型。这是为什么所有内置类型的typedef都以T开头的原因。T类可以作为自动变量而分配、作为其他类的成员而分配,或位于堆上
C类(如CActive、CBase)从CBase派生的所有类。C类总是分配在默认堆上。分配对象时,CBase的operator new()将所有成员数据初始化为零。CBase也包括虚析构函数,因此通过对CBase*指针调用delete,正确析构它指向的任何对象
R类(如RFile、RTimer)拥有资源而不是位于默认堆上的所有类。通常分配为成员变量或自动变量;在少数情况,可分配在堆上。大部分R类使用Close()来释放资源
M类(混合类,等价于java中的接口,如MEikmenuObserver)由纯虚函数组成,不包含成员数据。
静态类(如User、Math)完全不能实例化的静态函数组成。这种类是库函数的容器。
------------------------------
2,数据名
枚举常量(EMonday..)枚举中的常量,枚举本身应该具有T前缀,而枚举常量是枚举的成员;#defined常量有时也使用E前缀
常量(KRgbRed..)#defined类型或const TInt类型的常量
成员变量(iDevice、iX)任意非静态成员变量
参数(aDevice)声明为参数的任意变量,“a”代表参数
自动变量(device、X)声明为自动变量的任意变量
------------------------------
3,函数名
Symbian OS里,首字母的意义不如末字母重大。
void ConstructL();//_L():尾字母为L,表示异常退出函数,可能需要分配内存、打开文件等。一般来说,要进行一些由于资源不足或其他与环境相关的条件而可能失败的操作。调用这类函数时,总需要考虑异常退出时发生的情况。
CPhilosopher* NewLC(); //_LC():和L结尾的函数基本一致,只是分配对象后,将它推入清理栈(这个概念以后文章会讲述),如果函数失败,则异常退出。
【虎.无名:补充】TInt ExecuteLD(TInt aResId); //_LD():以D结尾意味着函数将删除在其中引用的对象。
还有一些函数的命名要求不是十分严格,可以仿照C++中的命名规范。
------------------------------
Ch1. Symbian OS中的类命名约定 【虎.无名】
基本类型:为了支持编译器无关性,在代码中尽量使用SymbianOS提供的内建typedef类型,而非原是类型。如:TIntX/TUintX(x=8,16,32,64),TReal32/TReal64=TReal,TTextX(x=8,16),TBool=int/ETrue/EFalse,用TAny*替代void*。
T类:不可以有(析构)函数,也不包含任何具有析构函数的数据成员。常常不定义缺省的(构造)函数。(可以)在堆栈上创建。可以具有“使用”关系(弱聚合)而非“拥有”关系(强聚合)的指针和引用。可用来定义C风格的结构体(以前版本使用S前缀)。T前缀也可用来修饰枚举类型(如enum TMouthsOfYear {EJanuary=1, EFebruary=2,...})
C类:都是从CBase派生出来的(在e32base.h中定义):1)具有虚拟构造函数;2)重载的new操作符,进行“零初始化”。C类对象必须总是在(堆)上创建。绝对不可以使构造/析构函数发生异常退出。
R类:为了避免构造/析构函数异常退出,最好采用“两步构造法”,定义Open()/Close()等方法。R类很少有(析构)函数,一般也不需要。R类通常很简单,一般没有显式拷贝构造或赋值操作。对同一句柄多次Close()安全,但对相同资源的多个句柄分别Close()不安全(试图释放一个失效句柄)。使用CleanupClosePushL()或CleanupStack::PushL(TAny*)确保资源被清除,后者简单调用User::Free()来完成。
M类:混合(mixin)的思想,用于实现多继承。通常是抽象接口类(只有纯虚函数),或者用来定义观察者类。注意定义顺序,先继承一个C类,然后才是多个M类。
静态类:只包含静态成员函数的类,不需要名字前缀。
【注意:所有规则都有例外!】如内核部分驱动类,堆描述符类HBufC。多思考一下例外的原因(历史原因、效率原因、具有不同的特性和行为)
------------------------------
【虎.无名:20070321补充】类型名字中,以C结尾的表示不可变类型,如(参考Ch5.3)不可修改的描述符TDesC、指针描述符TPtrC等。