无节操非程序猿

莫催稿,催稿也不交

跨平台的平台代码差异

CodeTyphon 作为一款本身就支持跨平台的开发工具,在原则上并不需要关注具体平台的特性,完全以 CodeTyphon 的组件库进行开发即可。而在实际开发中,由于部分特殊情况的存在,我们还是必须对平台的特殊性进行处理。

特别典型的是路径分隔符,在Windows下采用『\』符号,而在其他系统中均采用『/』符号,这就让我们必须针对这一分隔符作出处理:

此处的WINDOWS字样即是系统内部定义的环境变量,在不同的编译条件下,它将会被置为True或False,从而改变编译预处理语句的执行结果。

系统内已经内置了平台的条件,如下表所示:

CPU表:

CPU预处理定义描述
CPU86Intel 80x86或兼容版本(16位或32位)
CPU386Intel 80386 或更新版本
CPU68K摩托罗拉680x0或兼容版本
CPUSPARCSPARC v7或兼容版本
CPUALPHAAlpha AXP或兼容版本
CPUPOWERPCPower PC或兼容版本(32位或64位)
CPUPOWERPC32Power PC或兼容版本(32位)
CPUPOWERPC64Power PC或兼容版本(64位)
CPUX86_64Intel 64位处理器
CPUAMD64AMD 64位处理器
CPUX64Intel或AMD64位处理器
CPUARMARM 32 位处理器
CPUAVRAVR 16位处理器
CPU16任意16位处理器
CPU32任意32位处理器
CPU64任意64位处理器
CPU8086x86处理器(16位)

操作系统表:

OS预处理定义
linuxLINUX、UNIX
freebsdFREEBSD、BSD、UNIX
netbsdNETBSD、BSD、UNIX
sunosSUNOS、SOLARIS、UNIX
MS-DOSMSDOS
os2OS2
emxEMX、OS2
Windows(全部)WINDOWS
Windows (32位)WIN32
Windows (64位)WIN64
MacintoshMACOS
PalmPALMOS
BeOSBEOS、UNIX
QNXQNX、UNIX
Mac OS XBSD、DARWIN、UNIX

可以将CPU表和操作系统表内的值混合使用,以实现更为精确的预处理判断。如要判断 64 位的 Linux,可以使用以下指令:

{$IFDEF LINUX AND CPU64} ... {$ELSE} ... {$ENDIF

需要注意的是,若是进行Android开发,编译预处理时,将会指向Linux。对于不在表内的操作系统,均可以先用LINUX或UNIX进行尝试,一般情况下都可以编译通过并且正常运行。

三大平台除了路径分隔符的差异外,还有一些系统层面 API 的差异,如常用的 BaseUnix 单元,封装了大量 Unix 命令,而这些命令在 Windows 下被其他 API 所取代。这个时候就必须使用预处理语句,来解决掉平台在 API 层面的差异。

一个典型的例子是获取环境变量 PATH,在 Windows 和其他平台上,获取的方法并不一样:

可以清晰的看到,用于获取Path的函数在各个平台并不一致,为了顺利在各平台编译,必须引用平台相关的库。

除了系统定义好的预处理变量外,我们也可以自己来定义一些预处理值,如在 Android 开发时,可以自己定义一个 DEBUG 预处理变量,来决定编译一个 so 还是编译一个可供调试的可执行程序。

自定义的预处理变量并没有什么规则,只需要注意不要与系统定义的内容重复,其他的就全部开放给用户处理了,可以参考 BaseUnix 单元内的定义,它是一个非常优秀的预处理的实例:

实际上,编译预处理也可以像写普通程序一样,包含各种逻辑,而不是简单的定义或读取定义的值。深入理解预处理指令,将可以让程序更顺畅的进行跨平台编译,在每个平台上均发挥出最大的效能。


发表评论:

Powered By Z-BlogPHP 1.5.1 Zero

Copyright Rarnu 2017. All Rights Reserved.