2015-02-05 92 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. 確保其餘代碼可以與其付出的膽量一起移除。如有必要,請儘量舒適