我有一個正在開發的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