开发跨平台SDK如同在多个操纵体系的夹缝中走钢丝:你需要同时讨好Linux的严谨、Windows的霸道、macOS的优雅,甚至嵌入式体系的固执。以下是历经实战后的经验沉淀,以及几个值得深思的命题。
1. C/C++跨平台开发时有哪些值得注意的事项?
1.1. 你知道如何选择C++尺度的版本吗?
1.1.1. C++版本说明
对于C++跨平台开发来说,选择一个合适的C++版本是最为紧张的一件事情。C++跨平台开发最紧张的难点之一是办理平台的差异性。C++不同的版本支持的特性不同,版本越新支持的特性越多,很多平台的差异可能在新的尺度版本里C++语言层面就帮我们办理了。比如:C++11的chrono模块提供了跨平台的时间处理相干的工具,C++17的filesystem模块提供了跨平台的文件体系相干操纵。
1.1.2. 如何选择版本
题目: 在实际项目开发中,C++版本的选择是越高越好吗?
解答: 答案肯定是否定的,要视情况而定。
- 基于编译器的考虑: 通常我们所说的C++版本,是指C++尺度委员会推出的C++大版本,如C++11/C++14/C++17/C++20/C++23等。而这些版本是要由C++编译器来支持的,C++编译器本身也是一个软件,是软件就可能有Bug。C++编译器对这些C++版本的支持也是在持续迭代优化的。越新的C++版本由于支持的时间越短,因此存在Bug的可能性越大;而越老的版本由于编译器支持的时间更长,所以越稳定。
- 基于应用场景的考虑: 如果是应用层的项目,可以选择最新的C++版本。如果是SDK,SDK本身可能要支持更多的C++版本,建议选择低版本的C++。
1.1.3. 最佳实践
- 如果是开发新的应用层项目,建议选择较新的稳定版本的C++;结合实际情况,建议选择最新版本的前一到两个大版本,如如今(2025年02月)的最新版本是C++23,建议选择C++17或C++20。
- 如果是开发底层的SDK项目,SDK本身就希望能支持更多的C++版本,建议选择低版本的C++(如C++11),以覆盖尽可能多的用户。
- 如果是复杂的老项目:建议维持原有版本,非须要不做升级。
1.2. 源代码要如何保存,跨平台和跨IDE时才不会出现中文乱码?
1.2.1. 中文乱码题目与原因分析
C/C++跨平台开发时,通常需要在多个平台下开发、编译和调试,不同的平台可能会用不同的开发工具。如:
- Windows: Visual Studio XXXX (XXX表示版本系列,如:2017、2019、2022)
- Linux: Vim/VSCode + GCC编译器
- macOS: Xcode
中文乱码的现象和原因:
不同平台编辑和查看代码时,你可能常常会碰到的一个题目是中文乱码(代码解释或常量字符串的中文乱码)。如:Windows下显示正常,Linux(macOS)下显示为乱码;或Linux(macOS)下显示正常,Windows下显示为乱码。
而乱码的本质是文件编码方式不一致:
- Vim、VSCode、XCode保存的文件,默认编码是UTF-8(无BOM标记)。
- Visual Studio XXXX系列保存的文件,Visual Studio 2022默认是UTF-8 BOM(带BOM标记),2022之前的版本是操纵体系的本地编码,中文环境下默认是GBK。
办理思路和方法:
所以,办理题目的思路就是:所有源码文件都同一使用相同的编码格式保存。所有的编辑器、编译器、IDE都要同一编码格式,如同一使用UTF-8编码。
1.2.2. 办理计谋
所有源码文件都以UTF-8 BOM的格式保存,恣意平台的恣意IDE都接纳相同的格式保存。
由于到现在为止(2025年02月),各个平台和IDE对UTF-8 BOM格式的支持都很好。
1.3. 如何优雅的隔离平台的差异?
1.3.1. 用宏界说隔离平台的差异
C++跨平台开发,最紧张的一件事情就是:抹平平台的差异。不同平台的体系调用接口、文件体系的目次布局等都有所差异,为了实现不同平台的无缝对接,需要对这些差异举行隔离,最常用的方法就是通过预界说宏来实现。
通常有两种方式来实现平台差异的隔离:
- 操纵体系预界说宏,如_WIN32、__linux__。
- 编译器预界说宏,如:_MSC_VER、__clang__。
操纵体系预界说宏的通用性比编译器预界说宏更好,通常会接纳此种方式。除非我们确实需要使用某个指定编译器的特性时,才使用编译器预界说宏。
1.3.2. 最佳实践
代码实现:
用宏界说隔离平台的差异,实现代码通常会写成如下如许:
[code]#if defined(_WIN32) std::cout |