ISO 8601:2004中的C预处理器__TIMESTAMP__

问题描述 投票:9回答:4

我怎样才能在ISO 8601:2004中更换__TIMESTAMP__

__TIMESTAMP__

Sat Jul  6 02:50:06 2013

VS

__TIMESTAMP_ISO__

2013-07-06T00:50:06Z
c gcc clang c-preprocessor icc
4个回答
17
投票

哦,乐观主义者!你不会真的期望一个标准能够关注另一个,你呢? __TIMESTAMP__定义不在标准C中,正如您所知道的那样。有一个像你提出的__TIMESTAMP_ISO__这样的格式会很棒吗(你总是想要祖鲁时间,还是让当地时区偏移会更好?),但坦率地说,最简单的方法是添加它可能是一个补丁GCC和Clang等。

您可以尝试使用asctime()user1034749建议的answer,但我宁愿不尝试。

在GCC 4.8.1 manual中,有一个有趣的警告抑制:

-Wno-builtin-macro-redefined 如果重新定义了某些内置宏,请不要发出警告。这抑制了重新定义__TIMESTAMP____TIME____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  
<command-line>: warning: "__TIMESTAMP__" redefined
$ ./xx
2013-07-05T20:10:28
$

不是很漂亮,但它有效...哦,只是为了记录,源代码是(平凡的):

#include <stdio.h>

int main(void)
{
    printf("%s\n", __TIMESTAMP__);
    return 0;
}

2
投票

@Jonathan Leffler的回答提供了一个很好的解决方案,但可能有一件事被忽略了: 最初的问题是要求__TIMESTAMP__的替代格式,而__TIMESTAMP__要扩展为当前源文件的最后修改日期时间字符串。然而,最初的答案实际上是将__TIMESTAMP__指定为运行gcc的日期时间(即建造时间),其工作原理是__DATE____TIME__

如何提高: 使用@ mmond的answer,用date +'"%Y-%m-%dT%H:%M:%S"'替换-D__TIMESTAMP__=...中的date +'"%Y-%m-%dT%H:%M:%S"' -r xx.c命令,即在运行-r xx.c命令时添加选项date以引用xx.c. xx.c是正在构建的源代码。

参考: 根据海湾合作委员会的[manual][2]

__TIMESTAMP__ 此宏扩展为一个字符串常量,该常量描述上次修改当前源文件的日期和时间。


0
投票

如果您需要一种真正的跨平台方式来使用ISO 8601格式化的编译时间戳字符串或在编译时定义的任何其他格式,您可以考虑使用CMake(这总是很好考虑使用)。

你想要什么can be easily accomplished with CMake


-1
投票

为了这个目的,clang和gcc使用了C函数“asctime”,我想icc也使用它。在Linux上,您可以使用LD_PRELOAD捕获asctime调用并替换为您想要的任何字符串。

© www.soinside.com 2019 - 2024. All rights reserved.