__DATE__宏的格式不同

bol*_*eto 4 c c++ macros

C有一个预定义的宏__DATE__,它显示已编译源文件的日期.
日期以"Mmm dd yyyy"格式显示.

有没有办法使用宏格式化这个日期?
以这种格式"yyyy Mmm dd".

而不是:

2013年7月19日

应该 :

2013年7月19日

Jen*_*edt 10

在C中,您可以拥有一个宏,可以动态生成具有您喜欢的顺序的复合文字,例如

#define FDATE (char const[]){ __DATE__[7], __DATE__[8], ..., ' ', ... , '\0' }
Run Code Online (Sandbox Code Playgroud)

在所有重要的地方,优化器应该能够有效地处理这个问题.

  • +1我想不出更好的方法:) (2认同)
  • 请注意,这在C++中不起作用,因为ISO C++禁止复合文字. (2认同)
  • C++ 11使用的初始化列表几乎相同.例如`自动日期{__DATE __ [7],_ _ DATE __ [8],...` (2认同)

Lun*_*din 8

如果有人正在寻找一种方法来转换Mmm DD YYYY为仅包含 ASCII 数字的字符串YYMMDD (例如"220103"),那么这里是相应的代码。它应该可以在 C 和 C++ 中工作:

#include <stdio.h>

const char version[6+1] =
{
   // YY year
   __DATE__[9], __DATE__[10],

   // First month letter, Oct Nov Dec = '1' otherwise '0'
   (__DATE__[0] == 'O' || __DATE__[0] == 'N' || __DATE__[0] == 'D') ? '1' : '0',
   
   // Second month letter
   (__DATE__[0] == 'J') ? ( (__DATE__[1] == 'a') ? '1' :       // Jan, Jun or Jul
                            ((__DATE__[2] == 'n') ? '6' : '7') ) :
   (__DATE__[0] == 'F') ? '2' :                                // Feb 
   (__DATE__[0] == 'M') ? (__DATE__[2] == 'r') ? '3' : '5' :   // Mar or May
   (__DATE__[0] == 'A') ? (__DATE__[1] == 'p') ? '4' : '8' :   // Apr or Aug
   (__DATE__[0] == 'S') ? '9' :                                // Sep
   (__DATE__[0] == 'O') ? '0' :                                // Oct
   (__DATE__[0] == 'N') ? '1' :                                // Nov
   (__DATE__[0] == 'D') ? '2' :                                // Dec
   0,

   // First day letter, replace space with digit
   __DATE__[4]==' ' ? '0' : __DATE__[4],

   // Second day letter
   __DATE__[5],

  '\0'
};

int main(void)
{
  puts(__DATE__);
  puts(version);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Jan  3 2022
220103
Run Code Online (Sandbox Code Playgroud)

反汇编(gcc x86_64):

version:
        .string "220103"
Run Code Online (Sandbox Code Playgroud)