1.1.4 跨平台开发

主流开发平台

在上一节,我们介绍了目前的主流操作系统由3大桌面系统(Windows、macOS、Linux),以及两大移动终端系统(iOS和Android)组成。RTC的设计目标应该要能兼容这5大系统的不同之处。

对程序员而言,不同的操作系统对应着不同的首选IDE、编译器和SDK(Software Development Kit,软件开发包),如表1-1所示。

表1-1 不同操作系统的首选IDE、编译器和SDK

img

我们希望使用一份C++代码,就能适应不同环境下的基本编译环境。

跨平台编译

如何自动识别当前代码是在哪个平台编译的呢?

我们知道,每个平台的编译器都有一些独一无二的预定义宏(Predefined Marcos)。借助这些预定义宏,并假设我们在各个平台都使用官方推荐的开发环境,就可以识别当前的平台。

例如,微软的MSVC编译器会定义_MSC_VER宏;Android的Clang编译器会定义__ANDROID__宏。

所以,我们自动区分5个平台的示例代码如下:

img
img

我们可以在各个平台的差异文件中,配置各个编译器的特有属性及平台特有属性。

例如,在Windows平台上:

img

在iOS平台上:

img

基本类型

由于历史原因,在各种编译器下,C语言的基本类型的长度会有少量不一致。尤其注意wchar_t和long类型在不同系统中的长度。

我们使用DTypes.h来定义自己的基本类型,屏蔽类型长度的不一致。

img

借助DConfig.h和DType.h,我们可以屏蔽C++代码在平台与编译器上的差别。

Hello World

作为本书的第一个代码示例,我们将实现一个跨平台的Hello程序,它会在不同的平台上显示不同的Hello提示。

我们设计一个跨平台隔离的C++类DXP[7],并为其封装两个static方法。

img

主程序如下:

img

上述代码在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)文件,测试各个平台下基本类型的长度是否符合预期。