如果在特定日期之后编译,则预处理器宏将删除代码

时间:2013-09-05 14:26:54

标签: gcc c-preprocessor

如果在特定日期之后编译,我希望不包含三行代码。 原因是它们提供向后兼容性。为了支持客户端和嵌入之间的交错释放,现在必须在那里。

下一个软件版本出现后,将删除此支持以强制客户升级嵌入式软件。由于这是几个月之后,这些线路有被遗忘的风险。

理想情况下,我想要一个

#if __DATE__ > MyDate
    code here
#endif

或类似的东西。 有没有办法做到这一点?

*代码使用GCC编译

4 个答案:

答案 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这样的整数,这对于诸如任务来说是理想的。但是这不存在。