要做一个自动增加版本号的小东西。参考了
http://www.biasecurities.com/blogs/jim/archive/2003/10/08/166.aspx
和
都是使用编译器自带的脚本工具,我对bs的脚本很不感冒并且它的移植性很差而且还有个问题,
不知道是我没找到还是什么,这个脚本有些不太好分的清楚一个大项目下的个个子项目导致一些奇怪的bug。
脚本的使用主要是对头文件的修改,网上一些非脚本的程序使用的方法是对资源文件的修改,第一种方法说了会有一些奇怪的bug第二种方法是会导致提示资源文件被编译器以外的修改的重新加载的提示。当是单一工程的时候还可以忍受,多个工程的时候会非常的痛苦。
所以我打算使用js的脚本来写,js的脚本是可以在系统下直接运行的,提供了有限的库。
可以把js直接添加到2003的工程处理事件里面在编译前运行。
说了这么多和define有什么关系呢?
就是js在处理文件上很是的不爽又要查找又要对比而且变化一下格式就要全部重来!!!
#define FILEVER 1,0,0,1
#define PRODUCTVER 1,0,0,1
#define STRFILEVER "1, 0, 0, 1/0"
#define STRPRODUCTVER "1, 0, 0, 1/0"
这段define的宏就让我痛苦了好久。bs里面又没有规则匹配的东西好用。匹配起来要对齐,要处理转义字符!
因为只需要最后一个字段变化所以我就考虑能不能把最后一个字段拿出来。
定义如下宏:
#define bulid/
1
#define FILEVER 1,0,0, bulid
这样无论什么脚本只要读第二行就可以不用再匹配规则。
这个是可以的运行没有问题的但接下来就麻烦了
#define STRFILEVER "1, 0, 0, build/0"
很遗憾这个宏不能运行!!!
#define STRFILEVER "1, 0, 0, " build "/0"
这样可以了吧?还是不成,build被替换后是常数...
这时候我想到#操作符,但这个操作符只能使用在参数宏里面所有我定义
#define str(h) #h
#define STRFILEVER "1, 0, 0, " str(build) "/0"
这样可以了吗?哈哈还是不行!!!
输出结果是t_str {0x00148d38 "1, 0, 0, build"}
str括号里的build被当成字符了并没有被替换?
这个时候只要定义两个连接宏就可以了代码如下
#define build /
1
#define linkB build
#define str(h) #h
#define link(h) str(h)
#define STRFILEVER "1, 0, 0," link( linkB )
build可以被正常替换了嘻嘻