假设您有一段代码必须根据您的程序运行的操作系统而有所不同.
这是旧学校的做法:
#ifdef WIN32
// code for Windows systems
#else
// code for other systems
#endif
但是这个必须有更清洁的解决方案,对吗?
最佳答案 我在职业生涯中亲眼看到的六家公司的典型方法是使用硬件抽象层(HAL).
这个想法是你把最低级别的东西放到一个专用的标题加上静态链接的库中,其中包括:
>固定宽度整数(Linux上为int64_t,Windows上为__int64等).
>公共库函数(Linux vs Windows上的strtok_r()vs strtok_s()).
>一种常见的数据类型设置(即:所有数据类型的typedef,例如xInt,xFloat等,在整个代码中使用,这样,如果基础类型发生变化,或者突然支持新平台,则无需重新编写并重新测试依赖于它的代码,这在劳动力方面可能非常昂贵).
HAL本身通常充斥着像您的示例中那样的预处理程序指令,而这正是事实的真实情况.如果使用运行时if / else语句对其进行包装,则由于未解析的符号,您的编译将失败.或者更糟糕的是,您可能会包含额外的符号,这会增加输出的大小,如果频繁执行该代码,可能会降低程序的速度.
只要HAL编写得很好,HAL的头和库就会为您提供一个通用接口和一组数据类型,以便在代码的其余部分中使用,而且麻烦最少.
从专业角度来看,最美妙的方面是,您的所有其他代码都不必关注架构或操作系统细节.您将在各种系统上拥有相同的代码流,这将通过扩展,允许您以各种不同的方式测试相同的代码,并找到您通常不会期望或测试的错误.从公司的角度来看,这可以节省大量的劳动力资金,而不会因为他们对生产软件中的漏洞感到愤怒而失去客户.