4

我有一个必须打印修订字符串的 c++ 项目。修订字符串由公司指定,协议包括构建时间为 yyyy/mm/dd。

我曾经将其指定为构建系统中的宏,但这不再是一个选项,因为会弄乱预编译的标头(在日期变化时进行增量构建)。

我正在尝试通过从编译器获取构建日期来实现这一点,但在 Mmm__DATE____TIMESTAMP__给出月份。

有什么想法可以将月份作为数字吗?


根据下面的答案,我完成的版本是:

#define __MONTH__ (\
  __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? "01" : "06") \
: __DATE__ [2] == 'b' ? "02" \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? "03" : "04") \
: __DATE__ [2] == 'y' ? "05" \
: __DATE__ [2] == 'l' ? "07" \
: __DATE__ [2] == 'g' ? "08" \
: __DATE__ [2] == 'p' ? "09" \
: __DATE__ [2] == 't' ? "10" \
: __DATE__ [2] == 'v' ? "11" \
: "12")

...

std::string udate = __DATE__;
std::string date = udate.substr(7, 4) + "/" + __MONTH__ + "/" + udate.substr(4, 2);
boost::replace_all(date, " ", "0");

谢谢

4

2 回答 2

7

我认为以下宏符合您的要求。在这里,我们正在处理每月的第三个字母,因为它在大多数月份(1 月/6 月、3 月/4 月除外)都是独一无二的,因此更容易比较。

#define MONTH (\
  __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 1 : 6) \
: __DATE__ [2] == 'b' ? 2 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 3 : 4) \
: __DATE__ [2] == 'y' ? 5 \
: __DATE__ [2] == 'l' ? 7 \
: __DATE__ [2] == 'g' ? 8 \
: __DATE__ [2] == 'p' ? 9 \
: __DATE__ [2] == 't' ? 10 \
: __DATE__ [2] == 'v' ? 11 \
: 12)
于 2013-11-04T01:29:43.463 回答
2

它是相似的,但正确的解决方案JunJan

#define __MONTH__ (\
    __DATE__[2] == 'n' ? (__DATE__[1] == 'a' ? "01" : "06") \
    : __DATE__[2] == 'b' ? "02" \
    : __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? "03" : "04") \
    : __DATE__[2] == 'y' ? "05" \
    : __DATE__[2] == 'l' ? "07" \
    : __DATE__[2] == 'g' ? "08" \
    : __DATE__[2] == 'p' ? "09" \
    : __DATE__[2] == 't' ? "10" \
    : __DATE__[2] == 'v' ? "11" \
    : "12")

如果您在我的解决方案中发现错误,请改进我。

于 2014-06-03T11:09:12.233 回答