我有一个应用程序,我使用编译器开关来控制是否包含大块代码。想想用自动变速器或手动变速器的车。 在调试模式下正常工作,但在发布模式下,它看起来像是自动传输和手动传输都被编译,因此汽车驱动得不太好......
我试图从编译器开关中获取选项控制功能是错误的吗?
更多细节: 我对编译器开关的理解存在缺陷。
以下评论中的简单项目。(不太擅长驾驶StackOverFlow)
继续比喻,(Winform)项目是用手动变速器建造的。它使用安装项目以调试模式部署。 (错误)。
几年后需要自动传输。 (没有产生基类的共性)。 想到的是,有一天可能需要再次手动传输。
看起来像编译器开关是一个好主意,决定使用哪个代码块。 自动传输版本再次以调试模式部署。
经过多年的跑步后,我决定将它发布。就在那时我注意到了这个问题。
要求的简单示例(谢谢)向我展示了不是两个块都被编译,只是#else中的块。即版本构建将开关视为关闭。
因此,除非我遗漏了某些答案,否则答案是不言而喻的。不要将编译器开关用于部署选项。
答案 0 :(得分:0)
我建议您使用合成而使用面向对象。有两个类,一个用于AutoTransmission
,另一个用于ManualTransmission
。每个都将派生自基类Transmission
然后,当您创建使用其中一个传输的对象时,您可以根据需要使用其中任何一个。
然后,当您创建使用Transmission
的对象时,只需实例化您需要的任何传输。这可以在config中定义,也可以是编译器常量。但是,我建议不要使用编译器常量,因为在执行自动重构时,#ifdef
禁用的块将不会被处理,并且在您更改编译器选项时可能无法构建。