предопределенный макрос — C ++ получает месяц как число во время компиляции

У меня есть проект C ++, который должен напечатать строку ревизии. Строка редакции определяется компанией, а протокол включает время сборки в формате гггг / мм / дд.

Я использую это как макрос из системы сборки, но это больше не вариант, потому что портит предварительно скомпилированные заголовки (в инкрементной сборке, когда день меняется).

Я пытаюсь реализовать это с получением даты сборки из компилятора, но __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

Решение

Я думаю, что приведенный ниже макрос соответствует вашим требованиям. Здесь мы работаем над 3-й буквой месяца, поскольку она уникальна для большинства месяцев (кроме января / июня, марта / апреля), поэтому ее проще сравнивать.

#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)
7

Другие решения

Это похоже, но правильное решение Jun а также Jan

#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")

Если вы нашли ошибку в моем решении УЛУЧШИТЬ меня.

1

По вопросам рекламы [email protected]