2010-12-04 94 views
3

我正在向我的可執行文件添加一項功能,以使用--version參數運行它。該項目非常大,並使用多個類。我想打印出所有課程的版本。自動版本編號

現在我的每個類都有一個函數static void print_info() { cout << "information here" << endl; },而帶main()的文件調用每個類的print_info

問題:有沒有辦法自動維護版本號的變化?

其他信息: 我和我的團隊使用NetBeans進行開發。我們也使用Subversion(svn),我知道它保持修訂號。問題只與版本號有關。我希望能夠分發一個可執行文件,該文件將打印版本號碼而不訪問Subversion服務器。

如果這有些模糊,我很樂意提供更多信息。 謝謝!

P.S. 我不在乎版本值是什麼。 Weather是由NetBeans生成的任意數字,或相應的Subversion修訂版本號,或者是最後一次修改的日期。

回答

1

首先,我建議你做一些除了你的print_info()以外的方法,因爲它不是很靈活 - 如果你想實際使用版本而不是簡單的打印到STDOUT,或者如果你想報告版本在給STDERR的錯誤信息中?返回一個const char字符串的static方法會更通用。

關於版本號的選擇,您當然可以在您的代碼中使用SVN關鍵字,它可以是substituted。例如(下面一箇中提供的鏈接中給出的例子),如果你有行

char[] versionString = "commit revision $Rev$"; 

,並有啓用相應的關鍵字替換svn propset svn:keywords "Rev" file.cpp,下次執行更新一次你的SVN客戶端將更新文本像

char[] versionString = "commit revision $Rev: 12 $"; 

,下一次你提交它的字符串將被覆蓋到新的正確的字符串,如

char[] versionString = "commit revision $Rev: 13 $"; 

如果你使用SVN,你應該分支和標記,在這種情況下,分支和標記信息(它構成$URL$關鍵字的一部分)是包含在你的版本字符串中的有用的東西。 $Revision$對於爲您提供更新之間更改的值也很有用。但請記住,只有在執行更新(檢出,提交等)時才更新關鍵字。如果您更改了代碼並進行編譯,則報告的$Revision$將與您最初簽出代碼時相同。據我所知,避免被這個問題困擾的唯一方法就是在編譯新版本的軟件之前採用一個提交代碼的過程 - 如果將它與標記發佈的過程結合起來在SVN內。

+0

看起來我會使用$ Id $。謝謝! – Mikhail 2010-12-05 22:04:53

3

您可以使用源文件上的subversion Revision屬性來激活文件中的$Revision$關鍵字替換。

string version = "$Revision:$"; 

http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html

+0

請注意,對於靜態字符串,「const char *」字符串可能比「std :: string」更好 - 請參閱http://stackoverflow.com/questions/1563897/c-static-constant-string中的討論-class-member – beldaz 2010-12-05 22:42:42

0

如果你想是這樣做,我會去一個#define在每個源文件的乞討,並以文件的最後修改日期更新(使用$日期:$或用您自己的腳本更新)。然後,您可以非常輕鬆地在print_info()中使用定義的常量。