0

我有一个应用程序,我在其中使用编译器开关来控制是否包含大块代码。想想自动变速箱或手动变速箱的汽车。在调试模式下工作正常,但在发布模式下,看起来自动变速箱和手动变速箱都已编译,所以汽车开得不太好......

那么我试图从编译器开关中获取选项控制功能是错误的吗?

更多细节:我对编译器开关的理解是有缺陷的。

下面评论中的简单项目。(不太擅长驱动 StackOverFlow)

继续类比,(Winform)项目是用手动变速器构建的。它是使用安装项目以调试模式部署的。(错误)。

几年后需要自动变速箱。(没有产生基类的共性)。当时的想法是有一天可能会再次需要手动变速箱)

似乎编译器开关是决定使用哪个代码块的好主意。自动传输版本再次以调试模式部署。

经过几年的运行,我决定应该发布它。那是我注意到问题的时候。

请求(谢谢)的简单示例向我表明,编译的不是两个块,只是#else 中的块。即发布版本将开关视为关闭。

因此,除非我遗漏了什么,否则答案是不言而喻的。不要将编译器开关用于部署选项。

4

1 回答 1

0

我建议您改用组合并使用面向对象。有两个类,一个用于AutoTransmission,另一个用于ManualTransmission。每个都将派生自一个基类Transmission 然后,当您创建使用这些传输之一的对象时,您可以根据需要使用其中任何一个。

然后,当您创建使用 a 的对象时Transmission,只需实例化您需要的任何传输。这可以在配置中定义,也可以是编译器常量。但是,我建议不要使用编译器常量,因为当您执行自动重构时,可能禁用的块#ifdef将不会被处理,并且在您更改编译器选项时可能不会构建。

于 2013-04-07T20:45:08.903 回答