ISO 8601:2004中的C预处理器__TIMESTAMP__
如何在ISO 8601:2004中更换__TIMESTAMP__
?
__TIMESTAMP__
Sat Jul 6 02:50:06 2013
VS
__TIMESTAMP_ISO__
2013-07-06T00:50:06Z
哦,乐观主义者! 你不会真的期望一个标准能够关注另一个,你呢? __TIMESTAMP__
定义不在标准C中,正如您所知道的那样。 有一个像你提议的__TIMESTAMP_ISO__
这样的格式会很棒(你总是想要祖鲁时间,还是让本地时区偏移更好?),但坦率地说,最简单的方法是添加它可能是一个补丁GCC和Clang等。
您可以尝试使用asctime()
按照user1034749的回答建议,但我宁愿不尝试。
在GCC 4.8.1 手册中 ,有一个有趣的警告抑制:
-Wno-builtin-macro-redefined
如果重新定义了某些内置宏,请不要发出警告。 这会抑制重新定义__TIMESTAMP__
__DATE__
,__FILE__
__BASE_FILE__
,__DATE__
,__FILE__
和__BASE_FILE__
。
这表明你可以尝试:
gcc ... -Wno-builtin-macro-redefined -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') ...
(注意从双引号括起来的date
字符串所需的象形文字。)但是,某些早期版本的GCC不支持该选项; 我不记得以前见过它了。 您仍然可以重新定义__TIMESTAMP__
:
$ gcc -std=c99 -Wall -Wextra -O xx.c -o xx $ ./xx Fri Jul 5 19:56:25 2013 $ gcc -std=c99 -Wall -Wextra -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') -O xx.c -o xx : warning: "__TIMESTAMP__" redefined $ ./xx 2013-07-05T20:10:28 $
不是很漂亮,但它有效…哦,只是为了记录,源代码是(平凡的):
#include int main(void) { printf("%s\n", __TIMESTAMP__); return 0; }
@Jonathan Leffler的答案提供了一个很好的解决方案,但可能有一件事被忽略了:
最初的问题是要求__TIMESTAMP__
替代格式,而__TIMESTAMP__
要扩展为当前源文件的最后修改日期时间字符串。 但是,最初的答案实际上是为__TIMESTAMP__
分配了正在运行的gcc的日期时间(即构建时间),其工作为__DATE__
和__TIME__
。
如何改进 :
在@mmond的回答中 ,用-D__TIMESTAMP__=...
替换date +'"%Y-%m-%dT%H:%M:%S"'
命令, date +'"%Y-%m-%dT%H:%M:%S"' -r xx.c
,即在运行date
命令时添加选项-r xx.c
以引用xx.c. xx.c是正在构建的源代码。
参考:
根据海湾合作委员会的[manual][2]
__TIMESTAMP__
此宏扩展为一个字符串常量,该常量描述上次修改当前源文件的日期和时间。
如果您需要一种真正的跨平台方式来使用ISO 8601格式化的编译时间戳字符串或在编译时定义的任何其他格式,您可以考虑使用CMake (这总是很好考虑使用)。
你想要的东西可以通过CMake轻松完成 。
为了这个目的,clang和gcc使用了C函数“asctime”,我想icc也会使用它。 在Linux上,您可以使用LD_PRELOAD捕获asctime调用并替换为您想要的任何字符串。