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

标签 c gcc clang c-preprocessor icc

如何在 ISO 8601:2004 中替换 __TIMESTAMP__

__TIMESTAMP__

Sat Jul  6 02:50:06 2013

对比

__TIMESTAMP_ISO__

2013-07-06T00:50:06Z

最佳答案

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

您可以按照 user1034749 的建议尝试使用 asctime() 进行修改的 answer ,但我不想那样做。

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

-Wno-builtin-macro-redefined
Do not warn if certain built-in macros are redefined. This suppresses warnings for redefinition of __TIMESTAMP__, __TIME__, __DATE__, __FILE__, and __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;
}

关于ISO 8601 :2004 中的 C 预处理器 __TIMESTAMP__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498556/

相关文章:

c - 如何获取电子邮件的 x-gm-labels

c - 默认全局变量的存储类(gcc 编译器)?

c++ - 为什么这个 Clang ASTMatcher 会导致错误的多态转换?

c++ - 静态的入栈、出栈、查看、遍历栈元素

c++ - C 中的嵌套函数?

c - 初始化结构时出现段错误

macos - OSX 如何使用位于当前工作目录或子目录 C/C++ 中的 GCC/G++ 编译框架

c++ - #pragma 警告 clang/msvc 兼容性

clang - LLVM 和 Clang 安装 : apt-get vs. 手动安装

c - 有没有一个好方法可以说如果 char 数组包含 null 则执行某些操作?