2015-02-05 79 views
1

我有一个正在开发的C++应用程序。我想发布一个免费版本和付费版本,生产版本在现有免费版本的基础上增加功能。如何在编译时关闭功能?

根据发布类型编译功能的最佳方式是什么?理想情况下,我会通过一个标志CMake,所以当构建二进制文件时,它还将包括我在生产版本中需要的任何代码。

+5

'#if(n)def'宏观? – emlai 2015-02-05 13:22:48

+0

通常情况下,代码将*始终*存在,但在启用额外“生产版本”代码的功能之前,请检查某种验证。 – 2015-02-05 13:22:50

+2

@JoachimPileborg这就是裂缝起作用的原因。 – 2015-02-05 13:26:46

回答

3

你回答了你的问题,你自己:)传递一个标志,你的编译器和代码门的功能与:

#ifdef YOUR_FLAG 
//your extra logic 
#elif 
//in case YOUR_FLAG is not defined 
#endif 

我正好用在游戏中我公司开发的同样的方法 - 在免费版本的广告启用和付费版本的代码被预处理器排除在外。

此外,您可以使用运行时检查,以防万一它更适合于某些特定任务,但正如它在问题的评论中提到的那样 - 代码在那里并且篡改内存(翻转您的标志)可能允许访问限制功能。

+0

问题是,如果要禁用多个组件中的功能,则这变得很难管理。 – ruipacheco 2015-02-05 13:57:13

+0

它确实使代码更易于管理,但这个问题可以并且应该通过正确使用良好的OOP实践来解决。举一个例子:切换到合成并定义一个可切换功能需要的接口,创建两个类,实现这个接口(纯虚拟类或任何其他类型的“接口”构造)(一个具有受限功能,另一个没有限制),然后在#ifdef块中实例化这两个接口实现中的一个。好的OOP是国王,设计模式是他忠诚的骑士:) – 2015-02-05 14:48:54

0

您将它们添加为许可插件。

即:

  1. 保持代码的独立。哎呀,你甚至可以将“免费”代码许可为开源代码,并且仍然保持你的商业模式。
  2. 使他们的电话回家或验证一些密钥,以便您知道所述的人被授权。
  3. 确保其余代码可以与其付出的胆量一起移除。如有必要,请尽量舒适