Gcc 预处理器宏,用于在特定日期后编译时删除代码

Gcc 预处理器宏,用于在特定日期后编译时删除代码,gcc,c-preprocessor,Gcc,C Preprocessor,我想不包括三行代码,如果编译后的某个日期。 原因是它们提供了向后兼容性。为了支持客户端和嵌入之间的交错发布,现在就需要它 一旦出现下一个软件版本,将放弃此支持,以迫使客户升级嵌入式软件。由于这是几个月后,有风险的这些线路被遗忘 所以理想情况下我想要一个 #if __DATE__ > MyDate code here #endif 或者类似的东西。 有没有办法做到这一点 *代码是用GCC编译的不幸的是,这不起作用,因为\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu生

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

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

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

#if __DATE__ > MyDate
    code here
#endif
或者类似的东西。 有没有办法做到这一点


*代码是用GCC编译的

不幸的是,这不起作用,因为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
生成了一个格式为
“2013年9月5日”
的字符串,这对于比较是无用的


理想情况下,编译器应该支持一个常量,如
\uuuuu DATEFLAT\uuuu
,该常量生成一个整数,如
20130905
,这将非常适合此类任务。但是这是不存在的。

你不能用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>来实现这一点,因为它会扩展为字符串常量,而字符串常量不能用在

(你真的需要降低向后兼容性吗?如果它只有三行代码,考虑永远保持它们)。你的客户不会感谢你“强迫他们升级”。 这样做的好方法是通过版本控制系统。无论如何,您都应该为每个版本维护一个分支,因此请按照以下方式编写代码:

#ifdef BACKWARD_COMPAT_VERSION_1_0
    compatibility code here
#endif

然后更改发布分支上的Makefile,仅将
-DBACKWARD\u COMPAT\u VERSION\u 1\u 0
包含在您的CFLAGS中。

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

为什么不改用项目的版本呢

// Only defined in old projects that you want this legacy code in.
#ifdef OLD__VERSION
    code here
#endif

此解决方案专门针对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;

放弃兼容性的原因是其他事情真的不起作用。通过移除这些线,它可以以安全和早期的方式断开东西。版本控制方式似乎是一种明智的方法。我仍然希望它是基于日期的,但如果没有人能提出这样做的方法,我将尝试这样做。谢谢我恐怕不适合我的环境,但知道这一点是件好事。感谢Unixy makefile,
-DBUILD_DATE=“$$(DATE+%Y%m%d)L”
将是一个粗略的等价物,我认为。”Ware引用令人头痛的问题。通过使用以下划线开头的宏名称,后跟大写字母,如
\u VA\u BUILD\u DATE
,可以调用未定义的行为,因为此类名称是根据标准保留的(参见C99标准草案第7.1.3节)。