2013-09-05 24 views
4

我希望在特定日期後編譯的代碼不包含三行代碼。 原因在於它們提供向後兼容性。爲了支持客戶端和嵌入之間的交錯釋放,現在需要在那裏。如果在特定日期後編譯,預處理器宏將刪除代碼

一旦下一個軟件版本出現,這種支持將被迫下降,迫使客戶升級嵌入式軟件。由於這是幾個月以後,這些線路被遺忘的風險。

所以最好我想一個

#if __DATE__ > MyDate 
    code here 
#endif 

或等價的東西。 有沒有辦法做到這一點?

*代碼與GCC

回答

1

編譯不幸的是這不會爲__DATE__工作產生形式"Sep 5 2013",這是無用的比較的字符串。

理想情況下,編譯器應該支持一個像__DATEFLAT__這樣的常量,它會產生一個像20130905這樣的整數,這對於諸如任務等是很理想的。但是這不存在。

3

你不能這樣做__DATE__,因爲它擴展爲一個字符串常量,並且字符串常量不能在#if中使用。另外,設置一個固定的日期是一個壞主意,因爲你可能需要對舊版本進行bug修復,以保持向後兼容性。

(你真的需要砸的向後兼容性?如果只有三行代碼,只考慮讓他們撒手人寰。您的客戶不會感謝你「迫使他們升級。」)

做這種事情的好方法是通過你的版本控制系統。你應該保持每一個版本的一個分支,無論如何,所以寫你這樣的代碼:

#ifdef BACKWARD_COMPAT_VERSION_1_0 
    compatibility code here 
#endif 

,然後改變Makefile文件在發佈分支,只是,要在你的CFLAGS -DBACKWARD_COMPAT_VERSION_1_0

+0

原因丟棄的兼容性是其它事情真的是行不通的。通過去除這些線條,它以安全和早期的方式破壞了事物。 版本控制方式似乎是一個明智的做法。我仍然寧願它是基於日期的,但如果沒有人能提出一種方法來做到這一點,我會嘗試。 謝謝 – Hector

2

現在我面臨着不直接回答您的問題的風險。但我會冒險並建議你不要這樣做。項目按時發佈多少次?日期太容易改變。你永遠不知道。

爲什麼不使用您的項目的版本呢?

// Only defined in old projects that you want this legacy code in. 
#ifdef OLD__VERSION 
    code here 
#endif 
5

該解決方案專門用於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; 
+0

不適用於我的環境我害怕但它是一件好事情要知道。謝謝 – Hector

+1

在Unixy makefile中,'-DBUILD_DATE =「$$(date +%Y%m%d)L」'是一個大概的等價物,我想。 'Ware引用頭痛。 – zwol

+1

通過使用以'_VA_BUILD_DATE'大寫字母后跟下劃線開頭的宏名稱,可以調用未定義的行爲,因爲這些名稱是根據標準保留的(參見C99草案標準,第7.1.3節)。 –