From Forum Nokia Wiki
众所周知,2版和3版有诸多不同,但它们的主体结构大体相同,所以如果为不同版本单独编写工程,自然会有很多代码是相同而造成冗余。那么如何编写同时适合2 版和3版的工程呢?答案是:选择性编译,也就是在工程中利用选择性编译根据当前的编译环境编译不同平台的编码,当然不同文件中有不同的方法。
一.BLD和MMP等工程定义文件
例如bld.inf:
#ifdef EKA2
xxx30.mmp
gnumakefile icons_aif_scalable_dc.mk
#else
xxx20.mmp
#endif
可以依据编译环境选择不同的MMP或MK文件,当然工程文件夹中必须分别有2版和3版的两套工程定义文件;
再例如xxx.mmp:
#ifdef EKA2
TARGET MultiViews.exe
TARGETTYPE exe
#else
TARGET MultiViews.app
TARGETTYPE app
#endif
就可以利用一个MMP文件定义两种平台的目标类型,以及各种资源、库文件、路径等配置。
注:EKA2(Epoc Kernel Architecture 2)表明操作系统的核心版本为3.0或以上。
二.CPP文件
2版和3版的程序入口和部分API不同,所以必须依据编译环境的不同加以区别。
例如程序入口(继承自CAknApplication的实例):
#ifdef __SERIES60_30__
#include <eikstart.h>
#endif
EXPORT_C CApaApplication* NewApplication(){
}
return (static_cast<CApaApplication*>(new CxxxApplication));
#ifdef __SERIES60_30__
GLDEF_C TInt E32Main()
{
return EikStart::RunApplication( NewApplication );
}
#else
GLDEF_C TInt E32Dll( TDllReason /*aReason*/ )
{
return KErrNone;
}
#endif
再例如字体API:
#ifdef __SERIES60_30__
const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontSecondaryFont );
#else
const CFont* font = LatinBold12();
#endif
以上方法综合利用即可编写同时适合2版和3版的源代码。