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

Cet*_*ert 11 c gcc clang icc c-preprocessor

我怎样才能__TIMESTAMP__在ISO 8601:2004中取代?

__TIMESTAMP__

Sat Jul  6 02:50:06 2013
Run Code Online (Sandbox Code Playgroud)

VS

__TIMESTAMP_ISO__

2013-07-06T00:50:06Z
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 18

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

您可以asctime()按照user1034749回答尝试使用monkeying,但我宁愿不尝试.

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

-Wno-builtin-macro-redefined
如果重新定义了某些内置宏,请不要发出警告.这抑制了警告的重新定义__TIMESTAMP__,__TIME__,__DATE__,__FILE__,和 __BASE_FILE__.

这表明你可以尝试:

gcc ... -Wno-builtin-macro-redefined -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') ...
Run Code Online (Sandbox Code Playgroud)

(注意从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
$
Run Code Online (Sandbox Code Playgroud)

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

#include <stdio.h>

int main(void)
{
    printf("%s\n", __TIMESTAMP__);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!我在我的 makefile 中使用它:`CFLAGS += -D__TIMESTAMP_ISO__=$(shell date -u +'"\"%Y-%m-%dT%H:%M:%SZ\""')` 的工作原理如下具有 clang、gcc、icc 等的魅力。:) (3认同)
  • 很高兴它有效 - 它应该.从理论上讲,您不应该使用以双下划线开头的名称; 它们被保留用于"实施".正如我所指出的那样,你实际上不太可能遇到问题,但你也可以使用`-DTIMESTAMP_ISO = ...`并完全避免风险(与未来的'实现'相互碰撞). (3认同)
  • :)我会按你的建议更新我的用法!另外,如果我使用`-r $(SRC)`其中`SRC`是当前编译文件的make变量,如`CFLAGS + = -DTIMESTAMP_ISO = $(shell date -r $(SRC)-u +'') \"%Y-%m-%dT%H:%M:%SZ \""')`,我精确地匹配原始的`__TIMESTAMP__`行为; 即,除非在构建之前修改了源文件,否则每个构建的日期不会更改. (2认同)