C++在编译时将月份作为数字

gsf*_*gsf 4 c++ predefined-macro

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

我用它从构建系统中将其指定为宏,但这不再是一个选项,因为会混淆预编译的头文件(在日期更改时的增量构建中).

我想从编译器获得的生成日期,但要实现这个__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");
Run Code Online (Sandbox Code Playgroud)

谢谢

lol*_*ndo 7

我认为以下宏符合您的要求.在这里,我们正在处理本月的第3个字母,因为它在大多数月份(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)
Run Code Online (Sandbox Code Playgroud)

  • 太酷了,你知道“__DATE__”总是英文吗? (2认同)