1.1.4 跨平台开发
主流开发平台
在上一节,我们介绍了目前的主流操作系统由3大桌面系统(Windows、macOS、Linux),以及两大移动终端系统(iOS和Android)组成。RTC的设计目标应该要能兼容这5大系统的不同之处。
对程序员而言,不同的操作系统对应着不同的首选IDE、编译器和SDK(Software Development Kit,软件开发包),如表1-1所示。
表1-1 不同操作系统的首选IDE、编译器和SDK
我们希望使用一份C++代码,就能适应不同环境下的基本编译环境。
跨平台编译
如何自动识别当前代码是在哪个平台编译的呢?
我们知道,每个平台的编译器都有一些独一无二的预定义宏(Predefined Marcos)。借助这些预定义宏,并假设我们在各个平台都使用官方推荐的开发环境,就可以识别当前的平台。
例如,微软的MSVC编译器会定义_MSC_VER宏;Android的Clang编译器会定义__ANDROID__宏。
所以,我们自动区分5个平台的示例代码如下:
我们可以在各个平台的差异文件中,配置各个编译器的特有属性及平台特有属性。
例如,在Windows平台上:
在iOS平台上:
基本类型
由于历史原因,在各种编译器下,C语言的基本类型的长度会有少量不一致。尤其注意wchar_t和long类型在不同系统中的长度。
我们使用DTypes.h来定义自己的基本类型,屏蔽类型长度的不一致。
借助DConfig.h和DType.h,我们可以屏蔽C++代码在平台与编译器上的差别。
Hello World
作为本书的第一个代码示例,我们将实现一个跨平台的Hello程序,它会在不同的平台上显示不同的Hello提示。
我们设计一个跨平台隔离的C++类DXP[7],并为其封装两个static方法。
主程序如下:
上述代码在Windows上会输出Hello Windows\r\n。而在macOS上则会输出Hello macOS\n。
在下一节,我们将在此基础上实现一个跨平台的缓存管理类。
总结
在本节,我们简要地回顾了从古至今人类传递信息的各种方式。借助电与电磁波,人们有了高速传递信息的载体。借助计算机与互联网,人们有了操作信息的设备与传播信息的渠道。操作系统与智能手机的普及,让每个人都能随时随地参与信息的生产与消费。为了能屏蔽各个编程平台的差异,我们使用了预定义宏,并定义了一个通用类型系统。
活在信息时代的我们,一出生就被各种信息围绕。人的一生会接触各种各样的信息,我们需要了解信息、辨别信息、善用信息。这些是我们做决策赖以依据的根基。
在计算机中,信息都是用二进制数的0和1存储的。我们将在下一节具体介绍。
要点回顾
·计算机诞生前的通信技术。
·计算机的诞生与互联网的兴起。
·各种操作系统的特点。
·使用预定义宏识别编译平台。
·使用类型定义统一基本类型。
·实现跨平台的print函数。
参考阅读
1.《计算机发展简史》(1985年),陈厚云等编著。该书有非常多的史料细节。
2.Media Technology and Society(1998年),Brian Winston著。该书记录了从电报到互联网的各种历史发展与参考。其中提到,1665年,英国的罗伯特·胡克(Robert Hooke,1635—1703)提出了借助一根特制的电线瞬间传递一个声音的想法,这应该是最早的关于电话的设想。
3.《逻辑的引擎》(2005年),马丁·戴维斯著,张卜天译。该书描述多个数学家为计算机诞生所做的贡献。
4.《穿越计算机的迷雾》(2011年),李忠。该书用通俗易懂的语言讲述了计算机诞生前夜的故事。2018年出版了第二版。
5.F.P.Brooks另一本著作《设计原本》(The Design of Design),也是软件工程领域的经典。
6.《观止·Windows NT》讲述了Windows NT系统诞生的过程。
7.《离心力:互联网历史与数字化未来》(A History of the Internet and the Digital Future)(2018年),Johnny Ryan著,段铁铮译。该书提供了互联网诞生的许多背景材料。
8.有关CPU的指令介绍,可以在线下载Intel的编程手册[8]。
9.Windows平台上的开发资料
(1)《Windows核心编程》,Jeffery Richter著,是学习kernel32.dll主要函数的首选图书。
(2)《Windows程序设计》,Charles Petzold著,是学习user32.dll主要函数的首选图书。
(3)《Windows图形编程》,Feng Yuan著,是学习gdi32.dll主要函数的首选图书。
10.Linux下的开发资料
(1)《鸟哥的Linux私房菜》基础学习篇,是学习Linux命令行不错的入门材料。
(2)The UNIX Programming Environment(1983年),Brian W.Kernighan,Rob Pike著。
(3)Advanced Programming in the UNIX Environment3rd(2013年),W.Richard Stevens,Stephen A.Rago著。
11.iOS的开发资料
(1)iOS Programming:The Big Nerd Ranch Guide(2020年),Christian Keur,Aaron Hillegass著。
(2)Programming iOS 14(2021年),Matt Neuburg著。
12.macOS的开发资料
(1)OS X and iOS Kernel Programming(2011年),Ole Henry Halvorsen,Douglas Clarke著。
(2)*OS Internals,Volume I(2017年);Volume II(2019年),Jonathan Levin著。
13.Android的开发资料
(1)Android Programming:The Big Nerd Ranch Guide(2019年),Bill Phillips,Chris Stewart,Kristin Marsicano著。
练习题
1.[5分钟](通信概念)什么是通信?人们为什么要通信?古人为了通信都使用了哪些方法?
2.[10分钟](信鸽速率)古代人通过信鸽传递消息,调查一下其传输速率。
3.[10分钟](首份电报内容)上网查阅一下第一份电报的内容是什么。
4.[2小时](计算机发明史)计算机是如何发明的?有哪些关键事件?
5.[2小时](Wi-Fi发明人)Wi-Fi中的跳频技术是谁发明的?有何用途?
6.[10分钟](桌面系统版本)查看自己的Windows/macOS桌面系统使用的是什么版本?
7.[10分钟](手机系统版本)查看自己的手机使用的是什么系统?什么版本?
8.[30分钟](RFC查询与阅读)使用Web浏览器查阅第一份RFC的协议内容,并学习如何检索其他RFC文档。
9.[3人天](Linux命令)学习使用Linux命令,并编写一个Shell脚本,用于打印系统的版本号、CPU、内存、硬盘等信息。
10.[5人天](iOS编程)编写一个iOS App,尽可能多地显示当前系统的信息与用户设置。
11.[5人天](Android编程)编写一个Android App,尽可能多地显示当前系统的信息与用户设置。
12.[2人天](类型单元测试)为DTypes.h文件编写一个UT(Unit Test)文件,测试各个平台下基本类型的长度是否符合预期。