4

如果在某个日期之后编译,我希望不包含三行代码。原因是它们提供了向后兼容性。为了支持客户端和嵌入之间的交错发布,现在需要它。

一旦下一个软件版本出现,这种支持就会被取消,以迫使客户升级嵌入式软件。由于这是几个月后的事情,因此这些台词有被遗忘的风险。

所以理想情况下我想要一个

#if __DATE__ > MyDate
    code here
#endif

或等效的东西。有没有办法做到这一点?

*代码使用GCC编译

4

4 回答 4

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;
于 2013-09-05T14:34:18.870 回答
3

你不能用 来做到这一点__DATE__,因为它会扩展为一个字符串常量,而字符串常量不能在#if. 此外,设置固定日期不是一个好主意,因为您可能需要对旧版本进行错误修复发布,以保持向后兼容性。

(您真的需要放弃向后兼容性吗?如果只有三行代码,请考虑永远保留它们。您的客户不会感谢您“强迫他们升级”。)

做这种事情的好方法是通过你的版本控制系统。无论如何,您应该为每个版本维护一个分支,因此请编写如下代码:

#ifdef BACKWARD_COMPAT_VERSION_1_0
    compatibility code here
#endif

然后将发布分支上的 Makefile 更改为仅包含-DBACKWARD_COMPAT_VERSION_1_0在您的 CFLAGS 中。

于 2013-09-05T14:32:31.957 回答
2

现在我冒着不直接回答你的问题的风险。但我会冒险并建议你不要这样做。一个项目按时发布多少次?日期太容易改变了。而你永远不知道。

为什么不使用您的项目的版本呢?

// Only defined in old projects that you want this legacy code in.
#ifdef OLD__VERSION
    code here
#endif
于 2013-09-05T14:34:06.043 回答
1

不幸的是,这不起作用,因为__DATE__会生成一个格式为 的字符串"Sep 5 2013",这对于比较是无用的。

理想情况下,编译器应该支持一个常量 like __DATEFLAT__,它产生一个整数 like 20130905,这对于诸如任务来说是理想的。然而这并不存在。

于 2013-09-05T14:30:41.603 回答