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

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(使用前将#替换为@)

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

  • 对静态成员变量的未定义引用

    我有一个有静态成员的类 它也是我的程序中其他几个类的基类 这是它的头文件 ifndef YARL OBJECT HPP define YARL OBJECT HPP namespace yarlObject class YarlObject
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 如何启动异步任务对象

    我想开始收集Task同时处理对象并等待所有对象完成 下面的代码显示了我想要的行为 public class Program class TaskTest private Task createPauseTask int ms works w
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • Visual Studio Code 调试默认 ASP.NET Core MVC WebApp:不起作用

    我正在使用 Manjaro linux 并尝试调试默认的 ASP NET Core MVC 项目 但调试停止 没有任何错误 我创建了该项目 dotnet new mvc in a Meow文件夹 没什么特别的 然后添加了新的配置 NET C
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 参数数量在编译时确定的 Lambda 函数

    我想声明一个带有 N 个参数的 lambda 函数 其中 N 是模板参数 就像是 template
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • C# amo 获取角色完整

    我正在开发一个 SSAS 项目 其中除其他事项外 我需要获取 C 中表格多维数据集的完整用户列表 目前我让它以这样的方式工作 我可以获得角色 但数据不完整 当我调用 Server Database Roles 为了便于阅读而简化 属性并枚举
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include

随机推荐

  • 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 但一定有比这个更清洁的解决