编写平台特定代码的最佳(最干净)方法

2024-01-02

假设您的一段代码必须根据程序运行的操作系统而有所不同。
有一种老式的方法:

#ifdef WIN32
   // code for Windows systems
#else
   // code for other systems
#endif

但一定有比这个更清洁的解决方案,对吗?


在我的职业生涯中,我在六家公司亲眼见过的典型方法是使用硬件抽象层 (HAL)。

这个想法是,您将最低级别的内容放入专用标头和静态链接库中,其中包括以下内容:

  • 固定宽度整数 (int64_t在Linux上,__int64在 Windows 等上)。
  • 常用库函数(strtok_r() vs strtok_s()Linux 与 Windows 上)。
  • 通用数据类型设置(即:所有数据类型的 typedef,例如xInt, xFloat等等,在整个代码中使用,这样如果平台的底层类型发生变化,或者突然支持新平台,则无需重新编写和重新测试依赖于它的代码,这在劳动力方面可能非常昂贵)。

HAL 本身通常充满了预处理器指令,就像您的示例中一样,这就是问题的现实。如果你用运行时包装它if/else语句,您的编译将由于未解析的符号而失败。或者更糟糕的是,您可能包含额外的符号,这会增加输出的大小,并且如果频繁执行该代码,则可能会减慢程序的速度。

只要 HAL 编写得好,HAL 的标头和库就会为您提供一个通用接口和一组数据类型,以便您在代码的其余部分中轻松使用。

从专业的角度来看,这最美妙的一点是all您的其他代码不必关心架构或操作系统的细节。您将在不同的系统上拥有相同的代码流,这将允许您以各种不同的方式测试相同的代码,并找到您通常不会期望或测试的错误。从公司的角度来看,这在劳动力方面节省了大量资金,并且不会因为客户对生产软件中的错误感到愤怒而失去客户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写平台特定代码的最佳(最干净)方法 的相关文章

随机推荐

  • ClickOnce如何设置图标

    尝试在 ClickOnce 安装中设置图标的示例 但没有任何进展 在发布 gt 选项 gt 文件关联中设置 application的扩展名并选择我的图标 也许我正在寻找错误的方式来设置图标 但我的 app appref ms 仍然有默认图标
  • 序列化为 JSON 时排除集合中的特定项目

    我试图 挑选 我想要序列化的特定类型集合中的哪些对象 设置示例 public class Person public string Name get set public List
  • GCE使用云存储桶作为挂载驱动器

    有没有办法将存储桶挂载到实例 以便网络服务器可以将其用作存储 如果没有 如何在不添加另一个带有操作系统的永久磁盘的情况下向实例添加更多存储 除了附加新的永久性磁盘之外 您还可以使用许多基于 FUSE 的实用程序将 Google Cloud
  • 如何在提交时重新加载页面

    我有一个包含表单的 Bootstrap Modal 该模式还包含一个提交和取消按钮 取消按钮工作正常 并且正在成功关闭模态框 现在 根据我对模态框提交按钮单击的要求 通过将用户输入传递到 Web 服务 表单已成功提交 但模态框并未关闭 另外
  • AndroidX - 程序类型已存在:androidx.annotation.BoolRes

    我今天尝试使用 Android Studio 中的 重构 gt 迁移到 AndroidX 选项将当前项目迁移到 AndroidX 每当我尝试编译我的应用程序时 我都会收到一个 程序类型已存在 androidx annotation Bool
  • 在设备上将 GIF 转换为 MP4

    是否可以获取远程 但如果需要的话我可以先下载 GIF 序列并在设备上制作 MPMovies PlayerViewController 可播放的 mp4 我尝试过使用http api online convert com http api o
  • MongoDB 相当于 SQL“OR”

    所以 MongoDB在查找记录时默认使用 AND 例如 db users find age gte 30 lte 40 上述查询找到用户 gt 30AND 我如何找到 OR gt 40 岁 没有 OR 运算符 但他们说你仍然可以这样做 ht
  • 添加“constexpr”可以改变行为吗?

    给定两个程序 源代码中唯一的区别是其中一个的存在或不存在constexpr 有没有可能程序的含义发生了变化 换句话说 如果有一个编译器选项要求编译器努力推断constexpr在可能的情况下 它会破坏现有的标准代码和 或以不好的方式改变其含义
  • 在 C# 中对从 1 开始的数组进行变基

    我在 C 中有一个基于 1 的数组 通过调用 Excel Range 的 get Value 生成 例如 我得到一个二维数组 object ExcelData object MySheet UsedRange get Value Excel
  • 使用react-native-firebase在反应本机应用程序中链接器命令失败

    我使用react native firebase库开发了一个react Native应用程序 我想设置我的应用程序图标 所以我使用了这个库 npm install g yo generator rn toolbox from here ht
  • dplyr `left_join()` 不能将字符对象用作 LHS 变量 [重复]

    这个问题在这里已经有答案了 I can使用以下命令连接包含两个不同名称的变量的两个数据集dplyr left join by c name1 name2 我想要使用角色对象加入 left join by c nameOb1 nameOb2
  • 位对齐可提高空间和性能

    在书里游戏编码完成 第三版 https rads stackoverflow com amzn click com 1584506806作者提到了一种减少数据结构大小的技术and提高访问性能 本质上 它依赖于当成员变量内存对齐时获得性能的事
  • MonoGame 示例无法在 Mountain Lion 上编译

    所以我安装了MonoFramework MonoDevelop和MonoMac 并下载了最新版本的MonoGame 我尝试编译示例 但它们都因相同的错误而失败Parsing error of error Unknown platform 问
  • 确定 .NET 程序集是否是从同一源构建的

    有谁知道如何比较两个 NET 程序集以确定它们是否是从 相同 源文件构建的 我知道有一些差异实用程序可用 例如 Reflector 插件 但我对查看 GUI 中的差异不感兴趣 我只是想要一种自动方法来比较二进制文件集合以查看它们是否是从相同
  • 谷歌公共缓存 - 最大大小的默认值(和其他“可选”设置) - 想要一个使用所有“可用”内存的缓存

    我刚刚发现Guava http code google com p guava libraries 通过搜索缓存 API 它非常适合我的需求 但读完后出现一个问题wiki http code google com p guava libra
  • 如何向 Microsoft Teams Bot 添加选项卡?

    虽然有很多关于如何向团队添加选项卡的文档 但我似乎找不到任何关于如何创建和驱动用户使用选项卡内容 如 T Bot 中演示的内容 的文档 有人可以向我指出有关如何向机器人添加选项卡的任何文档吗 This is what I am talkin
  • 更改 WCF Web 服务的公开端点 URL,而不更改站点绑定

    我有一个托管在 IIS7 中的 WCF Web 服务 该服务在其 WSDL 中报告其端点 URL 如下所示 http machinename virtualdirectory service svc 然而 客户端需要使用的实际公共 URL
  • java.lang.NumberFormatException:对于输入字符串:“1”

    out txt 内容是 1 我的JAVA代码是这样的 int val 0 BufferedReader br new BufferedReader new FileReader out txt while true String line
  • 如何保证部署在tomcat服务器上的war文件的安全?

    我正在开发 Web 应用程序 并将该应用程序作为 war 文件托管在 tomcat 服务器中 它位于 tomcat 服务器的 webapps 文件夹中 但我需要保护我的托管文件 在 webapps 文件夹中 我找到了 war 文件并提取了我
  • 编写平台特定代码的最佳(最干净)方法

    假设您的一段代码必须根据程序运行的操作系统而有所不同 有一种老式的方法 ifdef WIN32 code for Windows systems else code for other systems endif 但一定有比这个更清洁的解决