如果在特定日期之后编译,我希望不包含三行代码。 原因是它们提供向后兼容性。为了支持客户端和嵌入之间的交错释放,现在必须在那里。
下一个软件版本出现后,将删除此支持以强制客户升级嵌入式软件。由于这是几个月之后,这些线路有被遗忘的风险。
理想情况下,我想要一个
#if __DATE__ > MyDate
code here
#endif
或类似的东西。 有没有办法做到这一点?
*代码使用GCC编译
答案 0 :(得分:5)
此解决方案专门针对Windows平台,是我在制作中使用的。
我利用环境变量%DATE%,并在用于启动IDE的批处理文件中,我有VA_CURRENT_DATE =%DATE:~6,4 %% DATE:~3,2 %% DATE:~0,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;
答案 1 :(得分:3)
您无法使用__DATE__
执行此操作,因为它会扩展为字符串常量,并且#if
中不能使用字符串常量。此外,设置固定日期是一个坏主意,因为您可能需要对旧版本执行错误修复版本,以保持向后兼容性。
(你真的需要以降低向后兼容性吗?如果它只有三行代码,请考虑永远保留它们。你的客户不会感谢你“强迫他们升级。”)
执行此类操作的好方法是通过您的版本控制系统。您应该为每个版本维护一个分支,所以编写如下代码:
#ifdef BACKWARD_COMPAT_VERSION_1_0
compatibility code here
#endif
然后更改发布分支上的Makefile,在CFLAGS中包含-DBACKWARD_COMPAT_VERSION_1_0
。
答案 2 :(得分:2)
现在我冒着不直接回答问题的风险。但是我冒了风险,建议你不要这样做。项目按时发布多少次?日期太容易改变了。你永远不会知道。
为什么不使用项目版本呢?
// Only defined in old projects that you want this legacy code in.
#ifdef OLD__VERSION
code here
#endif
答案 3 :(得分:1)
不幸的是,这不起作用,因为__DATE__
会生成"Sep 5 2013"
形式的字符串,这对于比较来说是无用的。
理想情况下,编译器应该支持像__DATEFLAT__
这样的常量,它产生一个像20130905
这样的整数,这对于诸如任务来说是理想的。但是这不存在。