__DATE__宏的格式不同

时间:2013-07-19 06:26:23

标签: c++ c macros

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

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

而不是:

  

2013年7月19日

应该是:

  

2013年7月19日

3 个答案:

答案 0 :(得分:9)

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

#define FDATE (char const[]){ __DATE__[7], __DATE__[8], ..., ' ', ... , '\0' }

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

答案 1 :(得分:3)

这是一个真正的黑客:

union {
    const char DOUBLE_DATE[18];
    const char PAD[19];
} DATE_HELPER = { __DATE__ " " __DATE__ };

const char *MY_DATE = DATE_HELPER.DOUBLE_DATE + 7;

答案 2 :(得分:0)

我想要在C ++程序中以ISO格式进行编译的日期,所以我想到了:

constexpr unsigned int compileYear = (__DATE__[7] - '0') * 1000 + (__DATE__[8] - '0') * 100 + (__DATE__[9] - '0') * 10 + (__DATE__[10] - '0');
constexpr unsigned int compileMonth = (__DATE__[0] == 'J') ? ((__DATE__[1] == 'a') ? 1 : ((__DATE__[2] == 'n') ? 6 : 7))    // Jan, Jun or Jul
                                    : (__DATE__[0] == 'F') ? 2                                                              // Feb
                                    : (__DATE__[0] == 'M') ? ((__DATE__[2] == 'r') ? 3 : 5)                                 // Mar or May
                                    : (__DATE__[0] == 'A') ? ((__DATE__[2] == 'p') ? 4 : 8)                                 // Apr or Aug
                                    : (__DATE__[0] == 'S') ? 9                                                              // Sep
                                    : (__DATE__[0] == 'O') ? 10                                                             // Oct
                                    : (__DATE__[0] == 'N') ? 11                                                             // Nov
                                    : (__DATE__[0] == 'D') ? 12                                                             // Dec
                                    : 0;
constexpr unsigned int compileDay = (__DATE__[4] == ' ') ? (__DATE__[5] - '0') : (__DATE__[4] - '0') * 10 + (__DATE__[5] - '0');

constexpr char IsoDate[] =
{   compileYear/1000 + '0', (compileYear % 1000)/100 + '0', (compileYear % 100)/10 + '0', compileYear % 10 + '0',
    '-',  compileMonth/10 + '0', compileMonth%10 + '0',
    '-',  compileDay/10 + '0', compileDay%10 + '0',
    0
};

// Test that it gets it right today
#include <cstring>
static_assert(strcmp(IsoDate, "2020-11-06") == 0);