2010-12-04 78 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()中使用定义的常量。