我有一个正在开发的C++应用程序。我想发布一个免费版本和付费版本,生产版本在现有免费版本的基础上增加功能。如何在编译时关闭功能?
根据发布类型编译功能的最佳方式是什么?理想情况下,我会通过一个标志CMake,所以当构建二进制文件时,它还将包括我在生产版本中需要的任何代码。
我有一个正在开发的C++应用程序。我想发布一个免费版本和付费版本,生产版本在现有免费版本的基础上增加功能。如何在编译时关闭功能?
根据发布类型编译功能的最佳方式是什么?理想情况下,我会通过一个标志CMake,所以当构建二进制文件时,它还将包括我在生产版本中需要的任何代码。
你回答了你的问题,你自己:)传递一个标志,你的编译器和代码门的功能与:
#ifdef YOUR_FLAG
//your extra logic
#elif
//in case YOUR_FLAG is not defined
#endif
我正好用在游戏中我公司开发的同样的方法 - 在免费版本的广告启用和付费版本的代码被预处理器排除在外。
此外,您可以使用运行时检查,以防万一它更适合于某些特定任务,但正如它在问题的评论中提到的那样 - 代码在那里并且篡改内存(翻转您的标志)可能允许访问限制功能。
问题是,如果要禁用多个组件中的功能,则这变得很难管理。 – ruipacheco 2015-02-05 13:57:13
它确实使代码更易于管理,但这个问题可以并且应该通过正确使用良好的OOP实践来解决。举一个例子:切换到合成并定义一个可切换功能需要的接口,创建两个类,实现这个接口(纯虚拟类或任何其他类型的“接口”构造)(一个具有受限功能,另一个没有限制),然后在#ifdef块中实例化这两个接口实现中的一个。好的OOP是国王,设计模式是他忠诚的骑士:) – 2015-02-05 14:48:54
您将它们添加为许可插件。
即:
'#if(n)def'宏观? – emlai 2015-02-05 13:22:48
通常情况下,代码将*始终*存在,但在启用额外“生产版本”代码的功能之前,请检查某种验证。 – 2015-02-05 13:22:50
@JoachimPileborg这就是裂缝起作用的原因。 – 2015-02-05 13:26:46