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