我希望在特定日期後編譯的代碼不包含三行代碼。 原因在於它們提供向後兼容性。爲了支持客戶端和嵌入之間的交錯釋放,現在需要在那裏。如果在特定日期後編譯,預處理器宏將刪除代碼
一旦下一個軟件版本出現,這種支持將被迫下降,迫使客戶升級嵌入式軟件。由於這是幾個月以後,這些線路被遺忘的風險。
所以最好我想一個
#if __DATE__ > MyDate
code here
#endif
或等價的東西。 有沒有辦法做到這一點?
*代碼與GCC
我希望在特定日期後編譯的代碼不包含三行代碼。 原因在於它們提供向後兼容性。爲了支持客戶端和嵌入之間的交錯釋放,現在需要在那裏。如果在特定日期後編譯,預處理器宏將刪除代碼
一旦下一個軟件版本出現,這種支持將被迫下降,迫使客戶升級嵌入式軟件。由於這是幾個月以後,這些線路被遺忘的風險。
所以最好我想一個
#if __DATE__ > MyDate
code here
#endif
或等價的東西。 有沒有辦法做到這一點?
*代碼與GCC
編譯不幸的是這不會爲__DATE__
工作產生形式"Sep 5 2013"
,這是無用的比較的字符串。
理想情況下,編譯器應該支持一個像__DATEFLAT__
這樣的常量,它會產生一個像20130905
這樣的整數,這對於諸如任務等是很理想的。但是這不存在。
你不能這樣做__DATE__
,因爲它擴展爲一個字符串常量,並且字符串常量不能在#if
中使用。另外,設置一個固定的日期是一個壞主意,因爲你可能需要對舊版本進行bug修復,以保持向後兼容性。
(你真的需要砸的向後兼容性?如果只有三行代碼,只考慮讓他們撒手人寰。您的客戶不會感謝你「迫使他們升級。」)
做這種事情的好方法是通過你的版本控制系統。你應該保持每一個版本的一個分支,無論如何,所以寫你這樣的代碼:
#ifdef BACKWARD_COMPAT_VERSION_1_0
compatibility code here
#endif
,然後改變Makefile文件在發佈分支,只是,要在你的CFLAGS -DBACKWARD_COMPAT_VERSION_1_0
。
現在我面臨着不直接回答您的問題的風險。但我會冒險並建議你不要這樣做。項目按時發佈多少次?日期太容易改變。你永遠不知道。
爲什麼不使用您的項目的版本呢?
// Only defined in old projects that you want this legacy code in.
#ifdef OLD__VERSION
code here
#endif
該解決方案專門用於Windows平臺,並且是我在生產中使用的東西。我用VA_CURRENT_DATE =%DATE:〜6,4 %% DATE:〜3,2 %% DATE:〜0,用來啓動IDE的批處理文件中,我利用了環境變量%DATE% 2%(爲我的特定語言環境轉換爲ISO8601日期)。
然後在我的項目,我的預處理器定義我定義VA_BUILD_DATE到VA_CURRENT_DATE
然後,我有一些代碼,如:
long day = VA_BUILD_DATE;
long year = day/10000;
day -= year * 10000;
long month = day/100;
day -= month * 100;
原因丟棄的兼容性是其它事情真的是行不通的。通過去除這些線條,它以安全和早期的方式破壞了事物。 版本控制方式似乎是一個明智的做法。我仍然寧願它是基於日期的,但如果沒有人能提出一種方法來做到這一點,我會嘗試。 謝謝 – Hector