我们的讲师告诉我们,在完成我们的任务时,我们只允许使用C ++ 98 / C99标准,通过为编译器指定正确的标志,我们可以确保不违反此规则。
我理解这是因为人们可以学习“真正的”C或C ++,无论他们选择哪一种,并且在没有任何新语言功能帮助的情况下运用这项技能(我不同意,但我是谁在争论)。
当问我的讲师他为什么回答这个规则时(知道我对上述答案不满意):“因为像嵌入式设备一样的ASML这样的老公司有旧的代码库(
我要求一个代码的特定现实世界/实际示例,它在C99 / C11(或C ++ 98 / C ++ 11)中编译,符合标准(C99 / C ++ 98)但是当以二进制形式表现时行为非常不同 - 总而言之,问题尚未得到解答。如果公司坚持旧编译器和标准的说法是正确的,有人可以提供我想亲眼看到的这样一段代码吗?
答案 0 :(得分:4)
我对嵌入式世界了解不多,但其他一些公司使用c ++并拥有旧硬件/平台
这实际上取决于他们使用的公司和平台。但是,通过一些努力和开放式管理,在任何地方(从技术角度来看)都不应该反对使用现代c ++
在几家公司中,我知道开发人员鼓励转向现代c ++,而且他们的行动越来越多。
有时你需要付出更多的努力而不是“只是”安装新的编译器。当您需要交付到旧平台(例如Debian 6)并且无法更改操作系统时,您必须在该平台上手动编译libstdc ++并将其与您的产品一起交付/让它使用特定的(有更多详细信息,但您得到要点)。
因此,由于保守的管理或开发人员不关心现代c ++,可能会有公司坚持使用旧的c ++。还有越来越多的公司升级。学习现代c ++也没有错误因为在使用现代c ++的公司中通常不鼓励使用“旧”风格。
代码在切换编译器时可能会“中断”,但仅限于编译级别,因为它们使用非标准功能/语法(一些较旧的编译器更容忍)。但行为明智我不知道“默默地”打破了什么(标准委员会正在积极尝试通过每次更改来避免这种情况)并且您也可以通过更好的编译器获得更多更好的警告。
答案 1 :(得分:2)
大公司的产品不一定是单一的代码库。代码库可能依赖于许多其他库(包括第三方)。
产品代码无法使用最新的编译器进行编译,除非并且直到使用该版本的编译器编译所有依赖项。 (至少静态库就是这种情况)
因此,一般来说,很难转移到具有大依赖性的大型产品的最新版本的编译器。此外,在移动到最新编译器之后应该产生大量的测试开销。
只有当ROI(投资回报率)良好时,管理层才同意上述做法,而传统代码很少这样做。
答案 2 :(得分:2)
这取决于公司,其嵌入式产品线和客户群。
有些公司有一种根深蒂固的文化,因此他们坚持使用旧技术,即使面对更新的合理技术论据。有些公司是渐进式的,并且只要有意义,就支持更新到更新的编译器和标准(相反,当有意义时,支持坚持使用旧技术)。一些公司决心采用最新趋势,他们使用未经证实的技术并损害其产品线的稳定性。
某些嵌入式产品使用不再生产的特定硬件组件,并且通过结合使用较新的硬件或软件,没有经济高效的替代方案。例如,对于硬实时系统,可能存在满足关键时序约束的旧硬件,但是不能轻易获得满足原始要求的新硬件。
一些嵌入式产品具有高度重要性(安全关键,关键任务等),并且有一个积极的监管机构坚持在批准更新之前提供大量可靠的技术证据(以及签署此类产品的代表没有书面证据的更新将在现场出现问题时承担法律责任 - 例如系统因时间错误导致某人死亡)。该文档的制作成本非常高。拥有此类产品的公司可能会发现坚持使用较旧的(由监管机构接受)开发环境更具成本效益。为了证明更新到更新的编译器,必须支付几百万美元,这往往会影响公司愿意提出合理使用新编译器的新证据。
最终,要销售产品,有必要说服付费客户支付费用。如果较旧系统的大部分客户不愿意为更新付费 - 毕竟现有系统工作正常 - 供应商没有理由更新 - 除非他们可以使客户的变更成本中性(在更新关键嵌入式系统时通常很难实现,除非供应商愿意承担大量成本)。类似地,关键客户可能实际上已经开发并随后维护现有系统,并且可能认为继续支付现有系统的维护费用比支付更新更好,并且经历提供的过程。证据证明它按要求运作。
答案 3 :(得分:1)
就在今年,我使用了两个超过20年的不同编译器。然而,这不适用于新设计。这是为了维护也约20年的产品。嵌入式产品可以支持数十年。在我的一个案例中,硬件组件已经过时,需要进行小型重新设计,这需要软件更新。在另一种情况下,必须更新硬件设计以符合RoHS标准,并且最终的设计需要软件更新。在这两种情况下,我认为使用现代编译器会产生更多的工作和风险。旧的代码和二进制文件已经过20年的在职经验证明。
在第三种情况下,微控制器已经过时,我们使用运行软处理器的FPGA重新设计。在这种情况下,需要一些移植,我使用了一个不同的,更现代的编译器。但我仍然非常谨慎地改变了原始源代码的程度。
我不会说我被策略“强迫”使用这些旧的编译器并避免使用新的编译器功能。当你保持旧的设计时,这可能是一个实用性的问题。或者可以选择进行较少的更改,以避免无意中破坏已证明有效的内容。
对于新设计,我们使用现代编译器。我从来没有把自己限制在较旧的C标准中。
PS:对于更加严酷的体验,您可以将自己限制在仅适用于Windows XP的编译器和需要PC上并行端口的调试器上。